呈现视图时,客户端缓存会覆盖自定义 Last-Modified

Client caching overrides custom Last-Modified when rendering a View

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

作为实验,我然后手动尝试将 Last-Modified header 设置为过去的某个时间,以查看它是如何工作的,但似乎在某处被覆盖了!我将此代码添加到我的 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;

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

是什么导致了这种行为,我如何手动设置 last-modified 时间戳以启用缓存?


附录

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

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


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