【发布时间】: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