IIS7でMVC3を使用しているときにgzip圧縮を有効にするにはどうすればよいですか?


100

MVC 3でgzip圧縮を有効にする方法を知っている人はいますか?IIS7を使用しています。

Google Chrome監査の結果:

  1. gzip圧縮を有効にする(4)
  2. 以下のリソースをgzipで圧縮すると、転送サイズを約3分の2(〜92.23KB)削減できます。
  3. / mydomain /は〜1.53KB節約できます
  4. jquery-1.4.4.min.jsは〜51.35KBを節約できます
  5. Cufon.jsは〜11.89KBを節約できます
  6. Futura.jsは〜27.46KB節約できます

複製を静かにしない:stackoverflow.com/q/552317/712526
jpaugh

回答:


142

web.config次のように、ファイルを介して圧縮を構成できます。

<system.webServer>
    <urlCompression doStaticCompression="true" doDynamicCompression="true" />
</system.webServer>

この構成要素のドキュメントは、iis.net / ConfigReferenceにあります。これは以下と同等です。

  1. インターネットインフォメーションサービス(IISマネージャー)を開く
  2. 変更する仮想ディレクトリに到達するまで、左側のツリービューをナビゲートします
  3. 右側のペインのタイトルが上記の仮想ディレクトリの名前になるように適切な仮想ディレクトリを選択します。
  4. 右側のペインの「IIS」の下にある「圧縮」を選択します
  5. 両方のオプションにチェックを入れ、右端の[アクション]で[適用]を選択します。

注:(コメントで指摘されているように) Http Dynamic Compressionがインストールされていることを確認する必要がありdoDynamicCompression="true"ます。そうでない場合、設定は効果がありません。これを行う最も簡単な方法は次のとおりです。

  1. [スタート]> [タイプ] optionalfeatures([ウィンドウの機能をオンまたはオフにする]ウィンドウにアクセスする最も簡単な方法です)
  2. 「Windows機能」ツリービューで、インターネットインフォメーションサービス>ワールドワイドウェブサービス>パフォーマンス機能に移動します。
  3. 「動的コンテンツ圧縮」がチェックされていることを確認します
  4. [OK]をクリックして、Windowsがコンポーネントをインストールするまで待ちます

11
これを機能させるには、Http Compression Dynamic IISオプションをインストールする必要があることに注意してください。この回答の構成参照リンクに詳細があります。
Caleb Vear 2012年

16
Windows Server 2008 optionalfeaturesでは動作しませんでした。代わりに、[サーバーマネージャー]> [役割]> [Webサーバー(IIS)にスクロール]に移動し、[役割サービスの追加]をクリックします。次に、Webサーバー>パフォーマンス>静的コンテンツ圧縮および動的コンテンツ圧縮がインストールされていることを確認します。
Rory

1
これが "Vary:"ホストヘッダーを台無しにする可能性があることに注意してください。さらに詳しい情報:stackoverflow.com/questions/5372052/...
jjxtra

2
少なくとも私の経験では、これはすべてを圧縮しますが、MVCコントローラーの出力を圧縮します。何らかの理由でgzip圧縮なしでHTMLを返します。
Chris Moschini、2014年

1
注意 !!!IIS動的圧縮はVaryヘッダーを取り除きますが、そのバグや機能はわかりませんが、カスタムフィルターを実装すると、キャッシュを正しく機能させることができます。
Akash Kava 2014

31

むしろそうする場合は、コードでこれを行うことができます。すべてのコントロールが継承するbasecontrollerを作成し、以下のこの属性で装飾します。

public class CompressAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {

        var encodingsAccepted = filterContext.HttpContext.Request.Headers["Accept-Encoding"];
        if (string.IsNullOrEmpty(encodingsAccepted)) return;

        encodingsAccepted = encodingsAccepted.ToLowerInvariant();
        var response = filterContext.HttpContext.Response;

        if (encodingsAccepted.Contains("deflate"))
        {
            response.AppendHeader("Content-encoding", "deflate");
            response.Filter = new DeflateStream(response.Filter, CompressionMode.Compress);
        }
        else if (encodingsAccepted.Contains("gzip"))
        {
            response.AppendHeader("Content-encoding", "gzip");
            response.Filter = new GZipStream(response.Filter, CompressionMode.Compress);
        }
    }
}

2
@JustAnotherUserYouMayKnow-リソースの提供方法によって異なります。サーバー上のファイルを直接指している場合はできませんが、アクションを介してそれらを提供する場合は(リソース管理システムで許可されているため)、見事に機能します。BTW Rick Strahlはこれを更新して、圧縮前に
Paul Carroll

4
リダイレクトする場合はfilternull にならないように保護することが重要です。使用しましたvar response = ...;if( response == null || response.Filter == null)return;
Travis J

2
また、のgzip代わりに最初に使用することもできdeflateます。詳細については、こちらをご覧ください。stackoverflow.com
Travis J

IISは圧縮ファイルをキャッシュするため、パフォーマンスを向上させるために再度圧縮する必要はありません。可能な場合はIISを使用し、IIS圧縮が利用できない場合にのみこのアプローチを使用してください。
Muhammad Rehan Saeed 2014

1
MVC5、IIS 8.5、.Net 4.5 Localhostで動作するこれらのソリューションはありません。私は何をすべきか、何か提案はありますか?
aadi1295 2015

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.