IIS поддерживает два типа сжатия: статическое сжатие содержимого и динамическое сжатие содержимого. Согласно applicationHost.config, они обрабатываются различными модулями: DynamicCompressionModule (compdyn.dll) и StaticCompressionModule (compstat.dll), и они настроены на сжатие различных типов запросов > . Кроме того, я предполагаю, что динамическое сжатие не кэширует сжатые запросы, а не статическое сжатие (по умолчанию сжатые файлы сохраняются в %SystemDrive%\inetpub\temp\IIS Temporary Compressed Files
).
Однако, помимо этих очевидных различий, я подозреваю, что есть что-то еще. Я думаю, что они подключаются к конвейеру IIS несколько иначе. Будет ли кто-нибудь внутри в некоторых подробностях?
Я узнал, что я играл с настраиваемым модулем для изменения файлов CSS на лету. Когда статическое сжатие было включено (и настроено для обработки набора файлов по умолчанию, то есть также text/css), в кэшированном запросе моему пользовательскому модулю был отправлен уже обработанный gzipped контент. Когда я переместил текст /css в список динамически сжатого запроса, все это начало работать. Но я хотел бы получить более убедительное доказательство того, что это действительно правильный способ сделать это. Существуют ли другие известные последствия/проблемы?
Обновление: Я думаю, у меня может быть теория о том, почему это происходит. Это может быть не на 100% правильным, но, по крайней мере, это может объяснить наблюдаемое поведение. Я думаю, что статический модуль сжатия регистрируется в следующих событиях (среди других):
RQ_MAP_REQUEST_HANDLER
RQ_EXECUTE_REQUEST_HANDLER
Затем, когда подан запрос на статический файл, статический модуль сжатия в OnMapRequestHandler проверяет, был ли файл сжат раньше и фактический файл не был изменен. Если это так, он перекроет запрос самому себе (возвращая соответствующее перенаправление с помощью IMapHandlerProvider). Когда он позже фактически отвечает за ответ в OnExecuteRequestHandler, он отправляет сжатый файл. Если, с другой стороны, файл не был сжат раньше или если он был изменен, он не перенаправляет отображение и позволяет статическому модулю содержимого обслуживать запрос, а затем в OnPostExecuteRequestHandler сжимает содержимое (и обновляет его кеш). Как уже упоминалось выше, я не говорю, что это именно то, что происходит (я не знаю исходного кода), это может быть только приближение. Кроме того, модуль динамического сжатия, скорее всего, не сделает этого. Он просто сжимает исходящие ответы иногда после RQ_EXECUTE_REQUEST_HANDLER.