TLDR
У меня есть IHttpHandler
, который выполняет сжатие. Он прекрасно работает сам по себе. Но затем я добавил IHttpModule
, который выполняет совершенно не связанную задачу с этими (и всеми другими) ответами, и теперь IIS повторно сжимает уже сжатые ответы. Как я могу предотвратить это?
Вся история
У меня есть реализация IHttpHandler
, которая выполняет комбинирование и сжатие (среди прочего) для файлов CSS и JS. Все в IHttpHandler
работает точно так, как я хочу.
Но затем я добавил реализацию IHttpModule
, которая удаляет ненужные заголовки ответов (Server
, X-AspNet-Version
и т. Д.) Из всех ответов (включая динамические ответы, генерируемые * 1018). *) во время события PreSendRequestHeaders
.
Однако, похоже, что простая регистрация IHttpModule
независимо от того, что он на самом деле делает, приводит к тому, что IIS применяет сжатие к ответу, даже если ответ уже сжат.
Итак, мой IHttpHandler
явно сжимает ответ и устанавливает заголовок Content-Encoding
, затем (если и только если) IHttpModule
также регистрируется, IIS повторно сжимает ответ (так что есть ответ с двойным сжатием) что браузеры не могут читать).
Я не хочу отключать все сжатие по умолчанию. Я все еще хочу, чтобы HTML из представлений был сжат (и я хочу, чтобы все CSS и JS, которые не проходят через IHttpHandler
, также были сжаты по умолчанию).
Я полагаю, что не существует простого решения моей проблемы, потому что это похоже на ошибку в IIS. IIS не должен сжимать уже сжатый ответ.
Я попытался добавить следующее в мой web.config, но это не дало эффекта:
<httpCompression>
<dynamicTypes>
<add mimeType="text/css" enabled="false" />
<add mimeType="application/javascript" enabled="false" />
</dynamicTypes>
</httpCompression>
(Из моей интерпретации документации это должно отключить сжатие для динамически генерируемых CSS и JS.)
Я тоже пробовал, безрезультатно:
<httpCompression>
<dynamicTypes>
<clear/>
</dynamicTypes>
<staticTypes>
<clear/>
</staticTypes>
</httpCompression>
(Из моей интерпретации документации следует отключить all сжатие по умолчанию.)
Обновление
В моем IHttpHandler
я звоню context.Response.Flush
в самом конце. Если я уберу этот вызов, ответ не будет сжат дважды. Я в порядке с этим в качестве решения. Кто-нибудь может объяснить, почему это происходит?
Обновление 2
Мое лучшее предположение состоит в том, что вызов Flush
переводит ответ в такое состояние, что IIS не считает, что ответ уже сжат (и поэтому он применяет сжатие по умолчанию). Хотя в моем модуле я могу проверить оба ...
- , что
Response.Headers
содержит заголовок Content-Encoding
и
- , что
Response.Filter
не является null
и является одним из System.IO.Compression
типов.
Не уверен, почему IIS не может определить, что ответ уже сжат из этих фактов.