当前位置: 首页 > 知识库问答 >
问题:

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

翟源
2023-03-14

我还没有完全理解.NETMVC的HTTP缓存是如何工作的,因为它看起来并不像是在实际检索缓存的资源文件。我想我需要在某处添加一些额外的代码。。。

首先,让我们看看我是如何在静态内容(即图像)上设置HTTP缓存的。在我的网络中。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值,我的过期率是应该的。此外,最后修改日期已经过去了。我认为最后修改日期是服务器最后一次被要求输入该文件的日期。

现在,让我们看一下已由 MVC 优化的 Javascript 文件的响应标头。作为提醒,本文指出“捆绑包设置 HTTP 过期标头,从创建捆绑包之日起一年后。

    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。静态内容响应标头上没有“public”的Cache-Control值。最后,Expires是上次修改日期后的1年,这是正确的,但上次修改日期始终与date值相同。在我看来,这些响应头就像是第一次从服务器请求并缓存资源时的头,而不是随后从缓存中请求并检索资源时的响应头。

提前感谢您的任何见解。

更新:它实际上似乎在IE中缓存。后续请求的最后修改日期在过去仍然是一个值。不过,我在FF或Chrome中没有看到这一点。我确认在这两个浏览器中,我都没有禁用缓存。这是怎么回事?

共有1个答案

缪嘉志
2023-03-14

首先,system.web 服务器/静态内容/客户端缓存仅适用于静态资源(文件)。因此,如果您直接访问图片,它就可以工作。

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

其次,使用 ETag过期上次修改是三种不同的缓存技术。您不应同时使用这两种技术,因为它们以不同的方式工作。

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

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

上次修改是一种古老的动态缓存机制。它的工作方式与ETag相同,但存在暴露正确修改日期的问题。在创建动态内容时,这不是一件容易找到的事情。

我认为结合多种技术应该只保留给深思熟虑的案例。详情请看这个答案。

您可能想阅读基础知识:HTTP 缓存

然后对于您的问题,我不确定为什么您的应用程序会公开这么多标题。捆绑包上存在“上次修改”是很奇怪的解释。捆绑包是一种虚拟的东西,它将各种文件组合为一个。因此,它没有上次修改的实际日期。您是否正在使用额外的缓存代码/模块?

 类似资料:
  • 问题内容: 我想确保浏览器永远不会缓存服务器的响应,这样即使发出两个相同的请求(相隔一纳秒),也始终会与服务器联系。这是实现此目标的正确方法: 谢谢唐 问题答案: 不,那不是正确的方法。这是正确的方法: 您可能会看到其他人在建议其他条目/属性,但是当至少提及上述内容时,它们是完全不相关的。 更改后,请不要忘记在测试之前清除浏览器缓存。 也可以看看: 网站站长缓存教程

  • 更新:我知道了,请看下面的答案。 我有一个AWS API网关api,定义了各种资源和各种GET和POST方法。 一切都很好。帖子正在通过。GET返回一个响应(JSON有效载荷),但返回的值似乎是缓存的值。 我的GET api调用一个Lambda函数,该函数调用对RDS的查询。我可以确认我的回答是过时的,因为: 当我手动查询RDS时,我会得到更新后的值 它确实刷新过一次,但我认为那是因为我越过了一些

  • 我想删除MVC中的http响应头。 HTTP/1.1 404找不到缓存-控件:私有内容-类型:text/html;charst=UTF-8服务器:Microsoft-IIS/8.0X-Powered-by:ASP.NET日期:Mon,23 Feb 2015 12:43:58 GMT内容-长度:4898连接:Keep-Alive 我使用以下代码删除连接、X-Powered-By、Server、Cac

  • 问题内容: 有什么方法可以获取原始响应的HTTP标头? 该方法对我不起作用,因为服务器吐出了多个“ Set-Cookie”,其中一些丢失了。 问题答案: 该方法对我不起作用 您是在的情况下问这个的吗?不可以,无法使用原始HTTP响应标头。您需要退回到低级的Socket编程。这是一个SSCCE,只需复制“ 粘贴 ”即可运行它。 为了避免每个尝试此代码片段的人都使SO过载,输出如下所示: 要了解有关以

  • 我们看到一些行为,我们没有在OkHttp中缓存响应,最终每次都访问服务器。但是,响应在将来会有一个过期时间,所以理想情况下它将被缓存。 从我对CacheStrategy的观察来看,问题是它将日期+年龄加在一起,以查看它是否超过了过期时间。在本例中,,因此它最终不会被添加到缓存中。 因此,我认为理想情况下,要么响应日期等于last-modified(在本例中,时间为2021年1月16日00:40:3

  • 我有一个问题与超文本传输协议头-缓存控制:max-age=1234我的源有那个头,但任何方式发送请求和接收304.我需要可能我错过了什么?还有一个,源除了缓存控制: max-age=1234在"响应头"有缓存控制: max-age=0在"请求头",可能是它的影响。 我的一个资源响应标题,示例: > 远程地址:10.6.237.13:443请求请求方式:GET状态码:304未修改