所以我在我的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
我已关闭所有模块并运行了一个失败的跟踪请求,结果显示标题已被设置:
但是我无法追踪到任何关于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>