IIS 8.5忽略MVC5客户端缓存

4
TL;DR - 我希望服务器(IIS 8.5)对CSS和JS捆绑包返回304未修改状态码。
我一直无法让IIS 8.5遵守web.config中的clientCache设置。无论我做什么,似乎都不能使其缓存静态内容。这是一个在VS2013中的MVC5应用程序。我把所有静态文件放在一个名为“Assets”的文件夹中。
请求如下: http://someserver/AppName/Assets/mainjs?v=FNj_9ZPAbYVAQsyDo2F8XUnWv5NQpY4iX2RGu4NpJ5g1 尝试#1,在Assets文件夹中放置一个新的web.config,并使用以下设置:
<configuration>
  <system.webServer>
    <staticContent>
      <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="30.00:00:00" />
    </staticContent>
  </system.webServer>
</configuration>
尝试 #2:将以下配置放置在根 Web.config 文件中。
<staticContent>   
    <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="365.00:00:00" />    
</staticContent>
尝试 #3:使用 location 标签设置缓存。
<location path="Assets">
  <system.webServer>
    <staticContent>
      <clientCache  cacheControlMode="UseMaxAge" cacheControlMaxAge="365.00:00:00" />
    </staticContent>
  </system.webServer>
</location>
以下是我在IIS 8.5管理器中尝试过的方法。 在默认网站/测试应用程序下:
  1. HTTP请求标头,设置常见的HTTP标头,勾选“在365天后”“过期Web内容”。
  2. 将相同的设置应用于“资产”文件夹。
我已经单独尝试了这些步骤,也一起尝试了所有其他方式。 无论如何,它都不会将max-age值添加到Cache-Control中。
对于每个步骤,浏览器返回CSS和JS捆绑包的200响应。 我无法让服务器缓存来自Assets文件夹的内容。
Cache-Control:private
Content-Encoding:gzip
Content-Length:22591
Content-Type:text/css; charset=utf-8
Date:Mon, 02 Feb 2015 21:49:49 GMT
Expires:Tue, 02 Feb 2016 21:49:49 GMT
Last-Modified:Mon, 02 Feb 2015 21:49:49 GMT
Persistent-Auth:true
Server:Microsoft-IIS/8.5
Vary:Accept-Encoding
X-AspNet-Version:4.0.30319
X-Powered-By:ASP.NET

那个请求的HTTP响应代码是什么? - Ross Bush
所有JS和CSS的响应代码都是200。我刚刚做了一个简单的Web应用程序,只有default.html和app.js,设置了clientCache,HTML文件将获得304,但JavaScript仍将返回200。那么...一定有什么东西阻止IIS为特定文件类型设置缓存控制吗? - azymm
你是否注意到了你的捆绑版本字符串有所变化? - Ross Bush
似乎没有变化 - 我刚刚再次检查了js版本,它与上面的FNj_9ZPAbYVAQsyDo2F8XUnWv5NQpY4iX2RGu4NpJ5g1相同。此外,我当前已将 runAllManagedModulesForAllRequests 设置为 true。 - azymm
我可能错了,但我认为在新版本被下载之前需要修改那个文件。如果时间戳或内容没有改变,则无需重新上传。如果修改js并重新编译,那么版本会改变吗? - Ross Bush
看起来浏览器每次请求都会下载文件并返回200。然而,我希望服务器对捆绑的CSS和JavaScript文件做出304(未修改)的响应。 - azymm
1个回答

0

检查捆绑包的各个文件。当您关闭优化时,这些文件看起来是什么样子?在注册捆绑包后,请调用:

BundleTable.EnableOptimizations = (!HttpContext.Current.IsDebuggingEnabled);

或者

BundleTable.EnableOptimizations = false;

可能是每个文件都返回未修改状态。在调试会话中刷新时,状态是否会发生变化?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接