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

时间:2016-03-09 16:44:04

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

我最近开始研究一个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;

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

导致此行为的原因是,如何手动设置上次修改的时间戳以启用缓存?

附录

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

1 个答案:

答案 0 :(得分:0)

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

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