我正在尝试将 [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);
}
}
}
if (response.Filter is GZipStream || response.Filter is DeflateStream)
,如果为真,则跳过其余的过滤器。 - Tom Mayfield