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行を取得していません、それらが使用される理由とこれらの行の目的は何ですか?説明してください!
ありがとう
JSおよびCSSファイルを圧縮する場合、これらのファイルはASP.NETランタイムなしで直接レンダリングされるため、実際にIISレベルで処理する必要があります。
IISでaspnet_isapi.dllにJSXおよびCSSX拡張マッピングを作成し、Zipコードを利用できますが、IISはあなたのためにこれのより良い仕事。
Content-encodingヘッダーは、レンダリングする前にコンテンツを解凍する必要があることをブラウザーに伝えます。一部のブラウザは、コンテンツの形状に基づいて、とにかくこれを把握するのに十分賢いですが、それを伝えるだけの方が良いです。
Accept-encodingキャッシュ設定は、gzip圧縮されたコンテンツのキャッシュバージョンがtext/htmlのみを要求したブラウザーに送信されないようにするためのものです。
以下は、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"/>
これは試してみるのに便利かもしれません。これは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");
}
}
ASPXファイルを圧縮するだけの理由は、作成したコードがASPXファイルにのみ埋め込まれているためです。 ASPXファイルは、含まれているリンクされたコンテンツとは別のリクエストです。したがって、次を含むASPXページがある場合:
<img src="www.example.com\exampleimg.jpg" alt="example" />
これは、ブラウザからリソースへの2つのリクエスト(DNSルックアップを除く)になります。
各リクエストには、独自のレスポンスSteamがあります。投稿したコードは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" />
..
リチャード
IIS7では、すべての要求が.netに送信されるため、これらのヘッダーをすべての応答に追加するHttpModuleを作成する必要があります。
IIS7を使用せず、共有ホスティングでは、使用していない.netファイル拡張子(.asmxなど)をマップし、web.configで.asmxファイルが設定されているHttpHandlerに移動することを指定するハンドラーを作成する必要があります。パスを.jpgなどに書き換え、ヘッダーも設定します。
最後の質問に答えるため。これらの2行は、ブラウザーに返される応答のHTTPヘッダーを設定します。 Content-Encoding
は、応答がgzipとしてエンコードされており、デコードする必要があることをブラウザに伝えます。最後の行はAccept-Encoding
を Vary header に。これにより、ブラウザまたはプロキシは、応答が一意であるか、他の特定のヘッダーの影響を受けているかを判断し、キャッシュを調整できます。
.asps拡張子を.cssまたは.jsファイルに追加します。ファイル内で<%@ Page ContentType = "text/css"%>またはjavascriptを使用して、正しいMIMEタイプでファイルを提供します。 &URL Rewriteを使用して、ユーザーエージェントブラウザーからこれを非表示にします。 content-encoding応答ヘッダーにはgzipが付加され、gzipが圧縮の実行に使用される方法であることを伝えます。応答ヘッダーをAccept-Encodingに設定して、すべてのキャッシュがどのページ(圧縮または非圧縮)を提供するかを判断するように変更します。要求のAccept-Encodingヘッダーによって異なります。これについて詳しく説明しました https://stackoverflow.com/a/14509007/1624169
<system.webServer>
要素内のweb.configファイルに次を追加するだけです。
<urlCompression doStaticCompression="true" doDynamicCompression="true" />
注:古いバージョンのIIS(v7.5未満)を使用している場合、プロセスがCPUを集中的に使用するため、doDynamicCompressionをfalseに設定できます。これらの問題は=で解決されました。 IIS 7.5。
参照: https://docs.Microsoft.com/en-us/iis/configuration/system.webserver/urlcompression
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でaspnet_isapi.dllにJSXおよびCSSX拡張マッピングを作成し、Zipコードを利用できますが、IISはあなたのためにこれのより良い仕事。
Content-encodingヘッダーは、レンダリングする前にコンテンツを解凍する必要があることをブラウザーに伝えます。一部のブラウザは、コンテンツの形状に基づいて、とにかくこれを把握するのに十分賢いですが、それを伝えるだけの方が良いです。
Accept-encodingキャッシュ設定は、gzip圧縮されたコンテンツのキャッシュバージョンがtext/htmlのみを要求したブラウザーに送信されないようにするためのものです。