6

ページの出力を圧縮するためのカスタムフィルターがあります。

public class EnableCompressionAttribute : ActionFilterAttribute
{
    const CompressionMode compress = CompressionMode.Compress;
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        HttpRequestBase request = filterContext.HttpContext.Request;
        HttpResponseBase response = filterContext.HttpContext.Response;
        string acceptEncoding = request.Headers["Accept-Encoding"];
        if (acceptEncoding == null)
            return;
        if (acceptEncoding.ToLower().Contains("gzip"))
        {
            response.Filter = new GZipStream(response.Filter, compress);
            response.AppendHeader("Content-Encoding", "gzip");
        }
        else if (acceptEncoding.ToLower().Contains("deflate"))
        {
            response.Filter = new DeflateStream(response.Filter, compress);
            response.AppendHeader("Content-Encoding", "deflate");
        }
    }
}

私は本からコードを入手しました:Pro ASP.NET MVC V2 Framework(.NETのエキスパートの声)。

今、私はこのようなアクションメソッドを持っています:

[OutputCache(Order=1, Duration=300,VaryByParam="*", VaryByContentEncoding="gzip; deflate")]
[EnableCompression(Order=0)]
public ActionResult About()
{
    return View();
}

OutputCacheフィルターが圧縮されたコンテンツをキャッシュしていることを確認するにはどうすればよいですか?この例のように「Order」パラメーターを使用するだけで十分ですか?

キャッシュで何が起こっているかをどのように確認できますか?

乾杯。

更新:Fiddlerでテストしましたが、フィルターでどの順序を使用しても機能するようです... gzipエンコードで最初の応答を取得し、クライアントがキャッシュを許可されている場合は、次のリクエストでhttp.302を取得します。サーバーのみが許可されている場合は、gzipエンコーディングを使用したhttp.200を追加

おそらくこれは、OutputCacheがデフォルトで最後のフィルターであり、それを変更する方法がないためです。誰かがこれを確認できますか?

4

1 に答える 1

4

このページをご覧ください。http://www.klopfenstein.net/lorenz.aspx/my-take-on-asp-net-output-cachingキャッシュアイテムの圧縮に関するJeff Atwoodのアドバイス など、いくつかの良い情報があります。

ページから..

順序は重要です

上記のActionFilterは、絶対に最後に実行する必要があります。最近発見したように、アクションフィルターがアクションの結果を変更するとすぐに、現在のアクションの呼び出しが中止されます。これは、実行する機会がなかった他のすべてのアクションフィルターが実行されないことも意味します。このキャッシュ方法をプロジェクトに追加する場合は、すべてのフィルターに適切な優先度があることを確認してください(Order優先度を使用して、正の整数を取り、低いものから高いものへと順序付けます)。

于 2011-09-09T10:41:29.780 に答える