我試圖獲得[CompressFilter]甜甜圈緩存和運行問題。我可以在ASP.NET MVC中使用[CompressFilter]而不破壞甜甜圈緩存
發生的是整個頁面被緩存,而不僅僅是甜甜圈。下面是我使用的CompressFilter
的來源。我將其從original source更改爲使用OnResultExecuted
而不是OnActionExecuting()
,因爲我需要訪問結果的類型以避免緩存某些ActionResult子類。
看看OutputCacheAttribute
的實際MVC v1源代碼,它看起來也是使用OnResultExecuted()
,但我不認爲這個事實直接導致了衝突。
我不太瞭解替換緩存如何工作以理解它爲什麼表現如此。我認爲值得注意的是,儘管這不會以任何形式的損壞顯示結束。它的行爲就像沒有甜甜圈!
它看起來像我將不得不使用某種II的'插件'來處理緩存,我真的想避免這樣做,但它看起來像我需要甜甜圈緩存。
我其實更感興趣,現在知道它爲什麼會產生這種效果,但如果可能的話,解決方案也會很棒。
public class CompressFilter : ActionFilterAttribute
{
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
HttpRequestBase request = filterContext.HttpContext.Request;
// dont encode images!
if (filterContext.Result is ImageResult)
{
return;
}
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);
}
}
}
+1:
請仔細閱讀本。 –
@jordan謝謝!我只是希望它沒有花費我一個小時才能弄清楚這個愚蠢的[CompressFilter]是什麼衝突。我正在檢查一切可能的原因,因爲甜甜圈緩存失敗,真的希望這不是問題 –
+1指向我這個有用的過濾器。謝謝! – jao