MVC的HTTP缓存 - Last-Modified响应头始终等于Date

时间:2014-02-27 17:00:56

标签: asp.net-mvc http-headers expires-header

我还没有完全理解.NET MVC的HTTP缓存是如何工作的,因为它似乎并没有真正检索缓存的资源文件。我想我需要在某处添加一些额外的代码......

首先,让我们看看我如何在静态内容(即图像)上设置HTTP缓存。在我的web.config中,我有以下内容:

<system.webServer>
    <staticContent>
      <clientCache cacheControlMode="UseExpires" httpExpires="Tue, 19 Jan 2038 03:14:07 GMT" />
    </staticContent>
</system.webServer>

这会导致我的应用程序中的图像看起来正确缓存。当我查看图像的响应标头时,我看到了这一点(删除了不必要的标头):

    Date:Thu, 27 Feb 2014 16:27:48 GMT
    ETag:"086f8d199a4ce1:0"
    Expires:Tue, 19 Jan 2038 03:14:07 GMT
    Last-Modified:Thu, 29 Aug 2013 09:26:20 GMT

我看到一个好的ETag值,我的Expires应该是什么。此外,Last-Modified日期已过去。我理解上次修改日期是服务器上次要求该文件的日期。

现在让我们看一下由MVC优化的javascript文件的响应头。提醒一下,this文章指出“ Bundles在创建捆绑包后的一年内设置HTTP Expires Header。

    Cache-Control:public
    Date:Thu, 27 Feb 2014 16:44:16 GMT
    Expires:Fri, 27 Feb 2015 16:44:16 GMT
    Last-Modified:Thu, 27 Feb 2014 16:44:16 GMT
    Vary:User-Agent

MVC缓存文件的响应标头缺少ETag。 Cache-Control值为“public”,静态内容响应头上没有。最后,Expires是Last-Modified日期之后的1年,这是正确的,但Last-Modified日期始终与Date值相同。对我来说,这些响应标题看起来就像是第一次从服务器请求资源并缓存时的情况,而不是随后从缓存中请求和检索资源时。

提前感谢任何见解。

UPDATE :它实际上似乎是在IE中缓存。后续请求的上次修改日期仍为过去的值。不过,我在FF或Chrome中没有看到这一点。我确认在这两种浏览器中,我都没有禁用缓存。是什么给了什么?

1 个答案:

答案 0 :(得分:0)

首先,system.webServer/staticContent/clientCache仅适用于静态资源(文件)。因此,如果您直接访问图片,它就会起作用。

bundle是动态资源(处理程序正在生成内容)。这就是配置指令不适用的原因。

其次,使用ETagExpiresLast-Modified是三种不同的缓存技术。你不应该同时使用这两种技术,因为它们以不同的方式工作。

Expires告诉浏览器将文件保留在缓存中直到指定日期。 在此日期之前,浏览器永远不会调用服务器

ETag是一种动态缓存机制。 浏览器将始终调用服务器,但如果内容未更改,则服务器可能无法响应内容。

Last-Modified是一种古老的动态缓存机制。它的工作方式与ETag相同,但是要求公开正确的修改日期是有问题的。在创建动态内容时,这不容易找到。

我认为结合多种技术应该只为经过深思熟虑的案例保留。有关详细信息,请参阅此answer

您可能需要阅读基础知识:HTTP caching

然后针对您的问题,我不确定为什么您的应用会暴露这么多标头。在一个包上出现Last-Modified很难解释。捆绑包是虚拟事物,它将各种文件合并为一个。所以它没有真正的最后修改日期。您使用额外的缓存代码/模块吗?