4
次の属性を使用して、BaseController
クラスをデコレートします。ASP.NET MVC 3でのコンテンツファイルのGZipping
public class OutputCompressAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
string encodingsAccepted = filterContext.HttpContext.Request.Headers["Accept-Encoding"];
if (string.IsNullOrEmpty(encodingsAccepted))
return;
encodingsAccepted = encodingsAccepted.ToLowerInvariant();
HttpResponseBase response = filterContext.HttpContext.Response;
if (encodingsAccepted.Contains("gzip"))
{
response.AppendHeader("Content-encoding", "gzip");
response.Filter = new GZipStream(response.Filter, CompressionMode.Compress);
}
else if (encodingsAccepted.Contains("deflate"))
{
response.AppendHeader("Content-encoding", "deflate");
response.Filter = new DeflateStream(response.Filter, CompressionMode.Compress);
}
}
}
問題は、これはビューとすべてのアクションの結果のためだけで正常に動作していても、属性は、プロジェクトの/Content
フォルダにもののために働いていない、ということです。 Content
フォルダーにあるファイルがコントローラーを使用するように、または何らかの方法でバインドされているか、応答ヘッダーにこれらのフィルターを追加できる何かによってフックされるように、どうすればいいのだろうかと思いました。
これはweb.configでは設定できません。共有ホスティング環境でどのように圧縮を設定しますか? – frennky
@frennkyこの場合、アクションフィルターの代わりにカスタムHTTPモジュール(IHttpModule)を使用する必要があります。アクションフィルタ(その名前が示唆しているように)は、アクション用です。静的ファイルを手動で圧縮する場合は、モジュールを使用します。しかし、画像やJavaScriptなどの静的リソースに対してこのモジュールを呼び出すには、アプリケーションを統合パイプラインモードで実行するように設定する必要があります。 –
@ダーリンには、GZipレスポンスに使用されるHTTPモジュールの例がありますか? – bevacqua