【问题标题】:Output caching in HTTP Handler and SetValidUntilExpiresHTTP 处理程序和 SetValidUntilExpires 中的输出缓存
【发布时间】:2011-03-01 08:52:34
【问题描述】:

我正在通过以下方式在我的自定义 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 处理程序响应是否有一些细节?

【问题讨论】:

    标签: .net asp.net caching outputcache


    【解决方案1】:

    我找到了原因。 查询字符串参数在我的 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;
    

    所有参数的变化。

    【讨论】:

    • 感谢您找到此解决方案,为我提供了单值查询参数。但是当我有一个像?id=1&amp;id=2&amp;id=3 这样的多值参数时,这仍然不起作用。我还不知道为什么,但想让其他人知道。
    【解决方案2】:

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

    您是否尝试过使用HttpCacheability.Server

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

    【讨论】:

    • 我试过了,但在这种情况下缓存根本不起作用。我使用 ASP.NET 开发服务器。
    猜你喜欢
    • 2010-12-12
    • 1970-01-01
    • 2011-04-22
    • 2010-11-09
    • 1970-01-01
    • 2016-02-29
    • 2011-01-26
    • 2011-11-16
    • 1970-01-01
    相关资源
    最近更新 更多