Как предотвратить сжатие IIS по умолчанию для уже сжатого ответа? - PullRequest
3 голосов
/ 12 декабря 2011

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 не может определить, что ответ уже сжат из этих фактов.

...