7

我通过以下方式在我的自定义 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-form,但不适用于处理程序:

        Response.Cache.SetCacheability(HttpCacheability.Server);

在服务器上缓存 http 处理程序响应是否有一些细节?

4

2 回答 2

18

我找到了原因。查询字符串参数在我的 URL 中使用,所以它看起来像“ http://localhost/Image.ashx?id=49 ”。我认为如果 VaryByParams 未明确设置,服务器将始终考虑 id 参数的值,因为 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;

所有参数的变化。

于 2010-06-09T10:42:28.897 回答
0

公共缓存能力取决于用户浏览器或代理,它指定响应可被客户端和共享(代理)缓存缓存。

你试过用HttpCacheability.Server

http://msdn.microsoft.com/en-us/library/system.web.httpcacheability(v=VS.71).aspx

于 2010-06-08T20:58:39.047 回答