4

TLDR

IHttpHandler圧縮を実行する があります。それはそれ自体でうまく機能します。しかし、その後IHttpModule、これらの (および他のすべての) 応答に対してまったく無関係なタスクを実行する を追加したため、IIS は既に圧縮された応答を再圧縮しています。どうすればこれを防ぐことができますか?

一部始終

IHttpHandlerCSS と JS ファイルの組み合わせと圧縮 (とりわけ) を実行する実装があります。私が望んでいるように、作品のすべてがIHttpHandler正確に機能します。

しかしその後、イベント中にすべての応答 ( によって生成される動的応答を含む) からIHttpModule不要な応答ヘッダー ( 、 など) を削除する実装ServerX-AspNet-Version追加しました。IHttpHandlerPreSendRequestHeaders

ただし、単に を登録するIHttpModuleと、実際の動作に関係なく、応答が既に圧縮されている場合でも、IIS が応答に圧縮を適用するようです。

そのためIHttpHandler、応答を明示的に圧縮してContent-Encodingヘッダーを設定し、(場合に限り)IHttpModuleも登録されている場合にのみ、IIS は応答を再圧縮します (したがって、ブラウザーが読み取ることができない二重に圧縮された応答があります)。

デフォルトの圧縮をすべて無効にしたくありません。ビューからの HTML を圧縮したい (そして、通過しない CSS と JSIHttpHandlerもデフォルトで圧縮したい)。

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>

(ドキュメントの私の解釈から、それはすべてのデフォルトの圧縮を無効にするはずです。)

アップデート

私のIHttpHandlerでは、最後に呼び出しますcontext.Response.Flush。この呼び出しを削除すると、応答は二重圧縮されません。解決策としてはこれでいいです。なぜこれが起こっているのか誰でも説明できますか?

更新 2

私の最善の推測ではFlush、IIS が応答が既に圧縮されているとは思わないような状態に応答が置かれる (そのため、デフォルトの圧縮が適用される) ということです。私のモジュールでは両方をチェックできますが...

  • ヘッダーをResponse.Headers含むContent-Encoding
  • それResponse.Filterは非nullであり、タイプの 1 つですSystem.IO.Compression

これらの事実から、IIS が応答が既に圧縮されていると判断できない理由がわかりません。

4

0 に答える 0