2012-02-10 7 views
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フォルダーにあるファイルがコントローラーを使用するように、または何らかの方法でバインドされているか、応答ヘッダーにこれらのフィルターを追加できる何かによってフックされるように、どうすればいいのだろうかと思いました。

答えて

9

このようなアクションフィルタを作成し、ホイールを再作成する代わりに、IISのactivate compressionにすることができます。静的コンテンツと動的コンテンツに対してこれを行うことができます。

+0

これはweb.configでは設定できません。共有ホスティング環境でどのように圧縮を設定しますか? – frennky

+4

@frennkyこの場合、アクションフィルターの代わりにカスタムHTTPモジュール(IHttpModule)を使用する必要があります。アクションフィルタ(その名前が示唆しているように)は、アクション用です。静的ファイルを手動で圧縮する場合は、モジュールを使用します。しかし、画像やJavaScriptなどの静的リソースに対してこのモジュールを呼び出すには、アプリケーションを統合パイプラインモードで実行するように設定する必要があります。 –

+0

@ダーリンには、GZipレスポンスに使用されるHTTPモジュールの例がありますか? – bevacqua