ASP.NET MVC + IIS 10 - Cache-Control始终是私有的

时间:2017-08-08 15:21:15

标签: c# asp.net asp.net-mvc caching

所以我在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,其他帖子建议可能是原因。

我知道我可以在代码中设置此标题,但我很想知道什么&amp;为什么强迫私人&#34;私人&#34;设置。

有人可以提供建议吗?

更新

Something is forcing responses to have cache-control: private in IIS7

因此,当没有用于请求的输出缓存(并且启用了输出缓存)时,这是.NET的默认行为。如果将&amp;的sendCacheControlHeader属性设置为false在web.config中 - 你没有得到Cache-Control:私有标题!

奇怪的是,您仍然无法根据节点获得正确的Cache-Control标头 - 但您可以通过该部分控制标头,因此现在可以使用:

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

1 个答案:

答案 0 :(得分:1)

在这种情况下缓存由.NET和MVC应用程序控制,这正是推动私有&#34;值。要控制此值,通常会使用适当的缓存行为来修饰控制器或操作:

  • [OutputCache(...)]&gt;具体控制输出缓存控制,例如持续时间(秒),编码差异,参数,标题或其他值,位置或其他配置选项

如果未设置缓存值,则&#34;私有&#34; value是MVC使用的默认值。如果要全局应用缓存设置,则可以在应用程序初始化期间创建过滤器并将其应用于全局过滤器。