我正在尝试让 [ CompressFilter ] 使用甜甜圈缓存并遇到问题。
发生的事情是整个页面被缓存,而不仅仅是甜甜圈。CompressFilter
我正在使用的来源如下。我将其从原始源更改为使用OnResultExecuted
,而不是OnActionExecuting()
因为我需要访问结果的类型以避免缓存某些 ActionResult 子类。
查看实际的 MVC v1 源代码,OutputCacheAttribute
它看起来也正在使用OnResultExecuted()
,但我不认为这个事实直接导致了冲突。
我对替换缓存的工作原理知之甚少,无法完全理解它为什么会这样。我认为值得注意的是,这最终不会导致任何损坏的显示。它的行为就像没有甜甜圈一样!
看起来我将不得不使用某种 IIs“插件”来处理缓存,我真的很想避免这样做,但看起来我也需要甜甜圈缓存。
我现在实际上更感兴趣的是知道它为什么会产生这种效果,但如果可能的话,一个解决方案也会很棒。
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);
}
}
}