【问题标题】:Client caching overrides custom Last-Modified when rendering a View渲染视图时,客户端缓存会覆盖自定义 Last-Modified
【发布时间】:2016-06-24 04:18:02
【问题描述】:

我最近开始从事一个 MVC.NET 项目,并很快注意到首页没有缓存。在 Index() 方法上设置 [OutputCache(Duration = 60), Location = Client] 会添加正确的 Expires 标题,但由于 Last-Modified 设置为创建页面的时间,因此缓存永远不会启动。

作为一项实验,我随后手动尝试将 Last-Modified 标头设置为过去的某个时间,以查看其工作原理,但似乎在某处被覆盖!我将此代码添加到我的 Index() 操作的末尾:

    DateTime dt = DateTime.Parse("2015-12-01");
    var timeString = dt.ToUniversalTime().ToString("R");

    var v =  View("Index", homeViewModel);
    Response.AddHeader("Last-Modified", timeString);

    return v;

即使我可以调试和检查响应中的标头并查看添加的标头,浏览器中返回的页面仍然有Last-Modified: Wed, 09 Mar 2016 15:34:12 GMT(当前时间)。因此,在操作返回后,我手动设置的标题被其他代码覆盖。

是什么导致了这种行为,如何手动设置上次修改的时间戳以启用缓存?


附录

使用Location = ServerAndClient 将使客户端缓存再次工作,这让我觉得有些奇怪......如果,那么Client 选项有什么用?它怎么会起作用?

【问题讨论】:

  • 感谢您的编辑。 Location=client 表示只有 Web 浏览器(或其他一些客户端)正在完成任何缓存。不在服务器上。这是你的意图吗?
  • 另一个可能的位置是代理服务器。因此,您实际上可以选择您希望缓存内容驻留的位置。
  • 你可能正在做一些事情......我认为设置客户端只会设置所需的标题,然后浏览器会将相应的标题传递给服务器,然后服务器只会发送新的响应,如果服务器上从来没有结果。这意味着服务器从不缓存任何东西,它会生成一个新的响应并检查是否有任何修改。如果内容发生更改,它将使用新的 Last-Modified 和 HTTP 200 发送内容,如果没有,则使用 HTTP 304。
  • @SRQCCoder 你能说出一个场景,设置 Location=Client 实际上会使浏览器在刷新时调用服务器吗?因为目前,我正在刷新浏览器以查看它是否会使用缓存版本或进行服务器调用,并且每次都会调用服务器(以及 Cache-Control: max-age=0)。
  • 没错。还有一点需要指出的是 OutputCache 发生在控制器级别。因此,如果您的视图中有代码(例如仅在 IsAuthenticated 时才显示这些内容),它很可能根本不会执行。

标签: asp.net-mvc asp.net-mvc-4 caching http-headers


【解决方案1】:

OutputCache 属性覆盖了我传递的相关标头。删除它可以设置我喜欢的任何标题。


要回答第二个问题,即客户端选项何时有意义,请注意刷新浏览器窗口时您将看不到任何效果。只有当您单击链接时,浏览器才会决定是否应该重用缓存版本。

【讨论】:

    猜你喜欢
    • 2011-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-22
    • 1970-01-01
    • 2013-02-01
    • 2017-03-04
    • 2011-02-02
    相关资源
    最近更新 更多