我在自定义HTTP处理程序中使用输出缓存,方法如下:
public void ProcessRequest(HttpContext context)
{
TimeSpan freshness = new TimeSpan(0, 0, 0, 60);
context.Response.Cache.SetExpires(DateTime.Now.Add(freshness));
context.Response.Cache.SetMaxAge(freshness);
context.Response.Cache.SetCacheability(HttpCacheability.Public);
context.Response.Cache.SetValidUntilExpires(true);
...
}
它可以工作,但问题是用F5刷新页面会导致页面重新生成(而不是缓存使用),尽管最后一个代码行:
context.Response.Cache.SetValidUntilExpires(true);
有什么建议吗?
UPD:似乎问题的原因是HTTP处理程序响应不在服务器上缓存。以下代码适用于Web表单,但不适用于处理程序:
Response.Cache.SetCacheability(HttpCacheability.Server);
是否有一些在服务器上缓存http处理程序响应的细节?
答案 0 :(得分:18)
我找到了原因。 查询字符串参数在我的网址中使用,因此看起来像“http://localhost/Image.ashx?id=49”。我认为如果未明确设置VaryByParams,服务器将始终考虑id param的值,因为context.Response.Cache.VaryByParams.IgnoreParams默认为false。但事实上,在这种情况下,服务器根本不使用缓存(尽管用户浏览器确实如此)。
因此,如果参数在查询字符串中使用,则应明确设置Response.Cache.VaryByParams,如
context.Response.Cache.VaryByParams.IgnoreParams = true;
忽略参数或
context.Response.Cache.VaryByParams[<parameter name>] = true;
通过某些参数或
进行变更context.Response.Cache.VaryByParams["*"] = true;
所有参数的变化。
答案 1 :(得分:0)
公共可缓存性取决于用户浏览器或代理,它指定响应可由客户端和共享(代理)缓存缓存。
您是否尝试过使用HttpCacheability.Server
http://msdn.microsoft.com/en-us/library/system.web.httpcacheability(v=VS.71).aspx