ASP.NETでGZip圧縮を実装する方法は?


81

asp.netページ(CSSファイルとJSファイルを含む)にGZip圧縮を実装しようとしています。次のコードを試しましたが、.aspxページのみが圧縮されます(YSlowから見つかりました)

HttpContext context = HttpContext.Current;
context.Response.Filter = new GZipStream(context.Response.Filter, CompressionMode.Compress);
HttpContext.Current.Response.AppendHeader("Content-encoding", "gzip");
HttpContext.Current.Response.Cache.VaryByHeaders["Accept-encoding"] = true;

上記のコードは、外部ファイルとして含まれているCSSファイルとJSファイルではなく、.aspxページコード(マークアップ)のみを圧縮しています。コードを使用してASP.NETでGZip圧縮を実装する方法を教えてください(IISサーバー構成にアクセスできない共有ホスティングサーバーを使用しているため)。また、上記のコードでは、最後の2行、それらが使用される理由、およびこれらの行の目的は何ですか。説明してください!


完全に重複しているわけではありません:stackoverflow.com/questions/6992524
jpaugh 2018

回答:


28

JSおよびCSSファイルを圧縮するには、これらのファイルがASP.NETランタイムなしで直接レンダリングされるため、実際にはIISレベルで処理する必要があります。

IISでJSXおよびCSSX拡張機能をaspnet_isapi.dllにマッピングしてから、郵便番号を利用することもできますが、IISはこれをより適切に処理する可能性があります。

content-encodingヘッダーは、レンダリングする前にコンテンツを解凍する必要があることをブラウザーに通知します。一部のブラウザは、コンテンツの形状に基づいて、とにかくこれを理解するのに十分賢いですが、それを伝える方が良いでしょう。

Accept-encodingキャッシュ設定は、gzip圧縮されたコンテンツのキャッシュバージョンがtext / htmlのみを要求したブラウザに送信されないようにするためにあります。


4
こんにちは@ Ben、IISを使用してファイルを圧縮する方法、実行する必要のあるすべての設定を教えてください。IIS構成にアクセスできませんが、実行しようとします。IISを使用してファイルを圧縮する方法を教えてください?? ありがとう!
Prashant

4
stackoverflow.com/a/6992948/8479には、IIS7以降に必要なweb.configへの簡単な変更の詳細が記載されています。
ロリー2013年

47

これがcssファイルとjavascriptファイルの解決策です。次のコードをweb.configファイル内に追加します。

  <httpCompression>
    <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll"/>
    <dynamicTypes>
      <add mimeType="text/*" enabled="true"/>
      <add mimeType="message/*" enabled="true"/>
      <add mimeType="application/javascript" enabled="true"/>
      <add mimeType="*/*" enabled="false"/>
    </dynamicTypes>
    <staticTypes>
      <add mimeType="text/*" enabled="true"/>
      <add mimeType="message/*" enabled="true"/>
      <add mimeType="application/javascript" enabled="true"/>
      <add mimeType="*/*" enabled="false"/>
    </staticTypes>
  </httpCompression>
  <urlCompression doStaticCompression="true" doDynamicCompression="true"/>

クレジット:ASP.NETおよびGoDaddyでGzipする方法


4
最後の行を削除する必要があります
JeffT 2017

trueですが、実際には開始<system.webServer>を追加します...これで、構成を配置する場所がわかります。
カルロスRバレボナ

同じコードを追加しましたが、ファイルが圧縮されていません
Zeeshan Ahmad Khalil

他に何か追加する必要がありますか?
Zeeshan Ahmad Khalil

16

これは試してみるのに役立つかもしれません。これはdeflateとgzip圧縮を受け入れます。

    void Application_PreRequestHandlerExecute(object sender, EventArgs e)
    {
        HttpApplication app = sender as HttpApplication;
        string acceptEncoding = app.Request.Headers["Accept-Encoding"];
        Stream prevUncompressedStream = app.Response.Filter;

        if (app.Context.CurrentHandler == null)
            return;

        if (!(app.Context.CurrentHandler is System.Web.UI.Page ||
            app.Context.CurrentHandler.GetType().Name == "SyncSessionlessHandler") ||
            app.Request["HTTP_X_MICROSOFTAJAX"] != null)
            return;

        if (acceptEncoding == null || acceptEncoding.Length == 0)
            return;

        acceptEncoding = acceptEncoding.ToLower();

        if (acceptEncoding.Contains("deflate") || acceptEncoding == "*")
        {
            // deflate
            app.Response.Filter = new DeflateStream(prevUncompressedStream,
                CompressionMode.Compress);
            app.Response.AppendHeader("Content-Encoding", "deflate");
        }
        else if (acceptEncoding.Contains("gzip"))
        {
            // gzip
            app.Response.Filter = new GZipStream(prevUncompressedStream,
                CompressionMode.Compress);
            app.Response.AppendHeader("Content-Encoding", "gzip");
        }
    } 

2
このコードをどうもありがとう。IISコンソールにアクセスできない特定のサイトでコンテンツをgzip /圧縮する必要がありました。これは役に立ちました。ただし、質問です。このコードは、すべてのaspxファイルをデフレートし、CSSとScriptResourcesをgzipしているように見えますが、.jsファイルをgzipしていません。それを行う方法はありますか?ありがとう。
ラファエルマーリン

あなたはこのような質の高い指導を扱っていないので、これは間違っています:gzip;q=0,deflatesingular.co.nz/2008/07/...
oligofren

11

ASPXファイルのみを圧縮する理由は、作成したコードがASPXファイルにのみ埋め込まれているためです。ASPXファイルは、それに含まれるリンクされたコンテンツとは別の要求です。したがって、以下を含むASPXページがある場合:

<img src="www.example.com\exampleimg.jpg" alt="example" />

これは、ブラウザからリソースへの2つのリクエスト(DNSルックアップは別として)になります。

  1. aspxページと
  2. aspxページに含まれる画像の場合。

各リクエストには独自のレスポンススチームがあります。投稿したコードはASPX応答ストリームにのみ添付されているため、ASPXページのみが圧縮されています。投稿されたコードの1行目と2行目は、基本的にページの通常の応答ストリームを引き継ぎ、「仲介者」コードを挿入しています。この場合、通常の出力ストリームをGZipストリームで食べて圧縮し、代わりにネットワークに送信します。

3行目と4行目は、応答ヘッダーを設定しています。すべてのhttpリクエストとレスポンスには、コンテンツの前に送信されるヘッダーがあります。これらは、サーバーとクライアントが何がどのように送信されているかを認識できるように、要求/応答を設定します。

この場合、3行目は、応答ストリームがgzipで圧縮されているため、表示する前にクライアントブラウザで解凍する必要があることをクライアントブラウザに通知しています。

そして、4行目は単に応答のAccept-Encodingヘッダーをオンにしているだけです。そうでなければ、これは応答に含まれていなかったでしょう。

* .jsや* .cssなどの他のMIMEタイプのマルチタイドを圧縮できる、書き込み/取得可能なプラグイン可能なモジュールがありますが、IISの組み込みの圧縮機能を使用する方がよいでしょう。

使用しているIISのバージョンを指定していませんが、IIS 7.0の場合は、<system.webserver>web.configファイルのセクションに次のようなものを含める必要があります。

<httpCompression> 
  <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll" /> 
 <staticTypes>
         <add mimeType="text/*" enabled="true" />
      </staticTypes>
</httpCompression> 
<urlCompression doStaticCompression="true" /> 

..

リチャード


本当に
ひどい

3

IIS7では、すべてのリクエストが.netに送信されるため、これらのヘッダーをすべてのレスポンスに追加するHttpModuleを作成する必要があります。

IIS7がなく、共有ホスティングでは、使用していない.netファイル拡張子(.asmxなど)をマップするハンドラーを作成し、web.configで.asmxファイルが設定されているHttpHandlerに移動するように指定する必要があります。パスを.jpgなどに書き換えて、そこにもヘッダーを設定します。


2

あなたの最後の質問に答えるために。これらの2行は、ブラウザーに返送される応答のHTTPヘッダーを設定します。Content-Encoding応答がgzipとしてエンコードされており、デコードする必要があることをブラウザに通知します。最後の行はVaryヘッダーに追加さAccept-Encodingれます。これにより、ブラウザまたはプロキシは、応答が一意であるか、特定の他のヘッダーの影響を受けているかを判断し、それらのキャッシュを調整できます。


0

.cssまたは.jsファイルに.aspx拡張子を追加します。ファイル内で<%@ Page ContentType = "text / css"%>またはjavascriptを使用して、正しいMIMEタイプでファイルを提供します。&URL Rewriteを使用して、これをユーザーエージェントブラウザから非表示にします。コンテンツエンコーディング応答ヘッダーにはgzipが追加され、gzipが圧縮の実行に使用されるメソッドであることを伝えます。応答ヘッダーの設定をAccept-Encodingに変更して、すべてのキャッシュがどのページ(圧縮または非圧縮)を提供するかを認識できるようにします。これは、要求のAccept-Encodingヘッダーによって異なります。私はhttps://stackoverflow.com/a/14509007/1624169でこれについて詳しく説明しました


0

<system.webServer>要素内のweb.configファイルに以下を追加するだけです。

<urlCompression doStaticCompression="true" doDynamicCompression="true" />

注:古いバージョンのIIS(v7.5未満)を使用している場合は、プロセスにCPUが集中するため、doDynamicCompressionをfalseに設定することをお勧めします。これらの問題はIIS7.5で解決されました。

参照:https//docs.microsoft.com/en-us/iis/configuration/system.webserver/urlcompression


0

web.configファイルでそれを行う

<system.webServer>
    <httpCompression>
        <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll"/>
        <dynamicTypes>
            <add mimeType="text/*" enabled="true"/>
            <add mimeType="message/*" enabled="true"/>
            <add mimeType="application/javascript" enabled="true"/>
            <add mimeType="*/*" enabled="false"/>
        </dynamicTypes>
        <staticTypes>
            <add mimeType="text/*" enabled="true"/>
            <add mimeType="message/*" enabled="true"/>
            <add mimeType="application/javascript" enabled="true"/>
            <add mimeType="*/*" enabled="false"/>
        </staticTypes>
    </httpCompression>
    <urlCompression doStaticCompression="true" doDynamicCompression="true"/>
</system.webServer>

または、IISを介して実行できます。JSおよびCSSファイルを圧縮するには、これらのファイルがASP.NETランタイムなしで直接レンダリングされるため、実際にはIISレベルで処理する必要があります。

IISでJSXおよびCSSX拡張機能をaspnet_isapi.dllにマッピングしてから、郵便番号を利用することもできますが、IISはこれをより適切に処理する可能性があります。

content-encodingヘッダーは、レンダリングする前にコンテンツを解凍する必要があることをブラウザーに通知します。一部のブラウザは、コンテンツの形状に基づいて、とにかくこれを理解するのに十分賢いですが、それを伝える方が良いでしょう。

Accept-encodingキャッシュ設定は、gzip圧縮されたコンテンツのキャッシュバージョンがtext / htmlのみを要求したブラウザに送信されないようにするためにあります。

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