ASP.NET MVC + IIS 10 - 缓存控制始终为私有

4

所以我在我的Windows 10笔记本电脑上本地运行了一个ASP.NET MVC 5网站,并按照web.config中的以下设置进行了配置。

在发布配置中编译,关闭调试模式:

<compilation debug="false" targetFramework="4.5.2" />

并且使用max-age的Cache-Control头:

<staticContent>
  <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="365.00:00:00" />
</staticContent>

无论我做什么,都会看到“Cache-Control: private”。
HTTP/1.1 200 OK
Cache-Control: private
Content-Type: text/html; charset=utf-8

我已关闭所有模块并运行了一个失败的跟踪请求,结果显示标题已被设置:

enter image description here

但是我无法追踪到任何关于ManagedPipelineHandler的信息,它似乎是设置标题的模块。

我尝试将Cache-Control添加为自定义标题:

<httpProtocol>
  <customHeaders>
    <remove name="X-Powered-By" />
    <remove name="Cache-Control" />
    <add name="Cache-Control" value="public, max-age=1800, must-revalidate" />
  </customHeaders>
</httpProtocol>

但这只是添加到现有的私人设置中:
HTTP/1.1 200 OK
Cache-Control: private,public, max-age=1800, must-revalidate
Content-Type: text/html; charset=utf-8

我的runAllManagedModulesForAllRequests设置为false,其他文章也建议这可能是原因。

我知道可以在代码中设置此标头,但我想知道是什么以及为什么强制使用“private”设置。

有人能给予建议吗?

更新

IIS7中有些内容会强制将响应标记为cache-control: private

因此,当请求未使用输出缓存(且启用了输出缓存)时,.NET的默认行为如此。如果将web.config中的sendCacheControlHeader属性设置为false,则不会得到Cache-Control:私有标头!

奇怪的是,仍然无法根据节点获取正确的Cache-Control标头 - 但您可以通过section控制标头,因此现在它正常工作:

<httpProtocol>
  <customHeaders>
    <remove name="X-Powered-By" />
    <add name="Cache-Control" value="max-age=30,public" />
  </customHeaders>
</httpProtocol>

你能解决这个问题吗?我也遇到了同样的问题。我想为WebApi方法返回不同的缓存控制头,以便在CDN上缓存结果。 - DavidJBerman
1个回答

1
缓存在此上下文中由.NET和MVC应用程序控制,这就是驱动“private”值的原因。要控制此值,通常需要使用适当的缓存行为装饰控制器或操作:

  • [OutputCache(...)] > 具体控制输出缓存控件,如持续时间(以秒为单位)、编码、参数、头文件或其他值的变化、位置或其他配置选项

如果未设置缓存值,则MVC将使用“private”作为默认值。如果要全局应用缓存设置,则可以创建筛选器并在应用程序初始化期间应用它。


1
那么你是说“默认”的MVC设置会覆盖完全合法的system.webserver设置吗?这似乎不太对。 - Neil

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