HTTP Handler和SetValidUntilExpires中的输出缓存

时间:2010-06-08 20:27:19

标签: .net asp.net caching outputcache

我在自定义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处理程序响应的细节?

2 个答案:

答案 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