C# ASP.NET MVC+;IIS 10-缓存控制始终是私有的

C# ASP.NET MVC+;IIS 10-缓存控制始终是私有的,c#,asp.net,asp.net-mvc,caching,C#,Asp.net,Asp.net Mvc,Caching,因此,我有一个ASP.NET MVC 5站点在我的Windows 10笔记本电脑的IIS 10上本地运行,在web.config中有以下设置 在版本配置中编译,调试模式关闭: <compilation debug="false" targetFramework="4.5.2" /> 我已关闭了所有模块,并运行了一个失败的跟踪请求,这表明正在设置标头: 但是我找不到关于这个ManagedPipelineHandler的任何信息,它似乎是设置标题的模块 我尝试将缓存控件添加为自定义标

因此,我有一个ASP.NET MVC 5站点在我的Windows 10笔记本电脑的IIS 10上本地运行,在web.config中有以下设置

在版本配置中编译,调试模式关闭:

<compilation debug="false" targetFramework="4.5.2" />
我已关闭了所有模块,并运行了一个失败的跟踪请求,这表明正在设置标头:

但是我找不到关于这个ManagedPipelineHandler的任何信息,它似乎是设置标题的模块

我尝试将缓存控件添加为自定义标头:

<httpProtocol>
  <customHeaders>
    <remove name="X-Powered-By" />
    <remove name="Cache-Control" />
    <add name="Cache-Control" value="public, max-age=1800, must-revalidate" />
  </customHeaders>
</httpProtocol>
我的runAllManagedModulesForAllRequests设置为false,其他帖子认为这可能是原因

我知道我可以在代码中设置这个头,但我想知道强制“私有”设置的原因

有人能提供建议吗

更新

因此,当请求没有使用输出缓存时(并且启用了输出缓存),这是.NET的默认行为。如果将web.config中的sendCacheControlHeader属性设置为false,则不会获得缓存控制:private头

奇怪的是,您仍然无法基于节点获得正确的缓存控制标头-但是您可以通过节控制标头,因此现在可以这样做:

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

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

  • [OutputCache(…)]>专门控制输出缓存控制,例如持续时间(秒)、编码差异、参数、标头或其他值、位置或其他配置选项

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

您是说“默认”MVC设置会覆盖完全合法的system.webserver设置吗?那似乎不对。你能解决这个问题吗?我也有同样的问题。我想为WebApi方法返回不同的缓存控制头,以便在CDN上缓存结果。
<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
<httpProtocol>
  <customHeaders>
    <remove name="X-Powered-By" />
    <add name="Cache-Control" value="max-age=30,public" />
  </customHeaders>
</httpProtocol>