vto*_*ola 6 outputcache http-compression action-filter asp.net-mvc-3
我有这个自定义过滤器来压缩我的页面输出:
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");
}
}
}
Run Code Online (Sandbox Code Playgroud)
我从本书获得了代码:Pro ASP.NET MVC V2 Framework(.NET中的专家语音).
现在我有一个这样的动作方法:
[OutputCache(Order=1, Duration=300,VaryByParam="*", VaryByContentEncoding="gzip; deflate")]
[EnableCompression(Order=0)]
public ActionResult About()
{
return View();
}
Run Code Online (Sandbox Code Playgroud)
如何确保OutputCache过滤器缓存压缩内容?使用像这个例子中的"Order"参数就足够了吗?
我怎样才能看到缓存中发生了什么?
干杯.
更新:我已经用Fiddler进行了测试,显然无论你在过滤器上使用什么顺序它都能正常工作......我得到了第一个使用gzip编码的响应,并且如果允许客户端缓存它,则在后续请求中使用http.302,或者如果只允许服务器,则使用gzip编码更多http.200
可能这是因为OutputCache是默认情况下的最后一个过滤器,并且没有办法改变它.有人可以证实吗?
看看这个页面,http://www.klopfenstein.net/lorenz.aspx/my-take-on-asp-net-output-caching 那里有一些很好的信息,特别是Jeff Atwood 关于压缩缓存项的建议
从页面..
顺序很重要
上面的 ActionFilter 绝对必须最后运行:正如我最近发现的,一旦操作过滤器更改操作结果,当前操作调用就会中止。这也意味着所有其他没有机会运行的操作过滤器将永远不会运行。如果您计划将此缓存方法添加到您的项目中,请确保所有过滤器都具有正确的优先级(使用顺序优先级,它采用正整数并从最低到最高排序)。
归档时间: |
|
查看次数: |
3423 次 |
最近记录: |