2

アプリケーションにActionResultが多すぎるため、gzip 圧縮を追加したいと考えています。

すべてのActionResultに属性を追加しないようにする解決策はありますか?
継承か何かのような?

これは私の比較コードです:

public class CompressFilter : ActionFilterAttribute
{
    public override void OnActionExecuting(FilterExecutingContext filterContext)
    {
        HttpRequestBase request = filterContext.HttpContext.Request;

        string acceptEncoding = request.Headers["Accept-Encoding"];

        if (string.IsNullOrEmpty(acceptEncoding)) return;

        acceptEncoding = acceptEncoding.ToUpperInvariant();

        HttpResponseBase response = filterContext.HttpContext.Response;

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

2 に答える 2

0

おそらく、これが理にかなっているすべてのコンテンツ タイプに対して、web.config ファイルで gzip 圧縮を構成する必要があります。そのための組み込みの HTTP モジュールがあります。

このresponse.Filter方法は、ASP.NET で HTTP 圧縮を行うベスト プラクティスではありません。圧縮は、処理されるインフラストラクチャの問題です。

于 2012-12-09T17:31:22.070 に答える
0

はい、MVC 3 以降では、アクション フィルターをグローバル アクション フィルターに追加します。Global.asax.cs または FilterConfig.cs (プロジェクトのレイアウト方法に応じて) で、メソッド RegisterGlobalFilters にフィルターを追加するだけです。

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new HandleErrorAttribute());
    filters.Add(new CompressFilter());
}
于 2012-12-09T17:34:47.187 に答える