IIS 10.0 API接口响应异常添加Pragma、Expires禁用头排查求助
排查思路
- 检查.NET Framework输出缓存模块的默认配置:仅动态请求(包括API接口)会触发
OutputCache模块的默认头写入逻辑,静态资源不会触发,这是Pragma、Expires头最常见的动态请求专属注入来源。可先在站点级web.config的<system.web>节点下验证是否存在缓存配置,或者查看全局.NET Framework配置的缓存默认策略。 - 核查IIS管道中托管模块的注入行为:优先排查自定义HTTP模块、第三方鉴权/流量管控插件是否只对路由匹配的API请求追加了缓存控制头,可在IIS管理器的「模块」功能中按执行顺序排查所有托管模块的配置。
- 验证配置继承链是否生效:你当前修改的是.NET Framework 2.0版本的全局web.config,如果你的API站点运行的是.NET Framework 4.x版本,需要对应修改
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\CONFIG\web.config中的customHeaders节点,同时还要检查站点根目录、API应用所在子目录的web.config是否存在<clear/>覆盖了上层的remove配置。 - 检查ASP.NET MVC/Web API的全局过滤器配置:即使业务代码没有显式设置响应头,全局注册的
OutputCacheAttribute或者第三方过滤器也会自动为接口响应追加缓存头,可查看Global.asax.cs或者WebApiConfig注册的全局过滤器列表。
可行解决方案
- 全局禁用输出缓存模块的默认头注入:在站点web.config中添加如下配置,禁用动态请求的默认缓存头生成:
<system.web> <outputCache enableOutputCache="false" omitVaryStar="true"> <providers> <clear /> </providers> </outputCache> <httpRuntime enableKernelOutputCache="false" /> </system.web>
- 使用URL重写规则强制出站移除头:针对匹配API路径的请求,强制在IIS出站响应阶段移除指定头,配置示例如下:
<system.webServer> <rewrite> <outboundRules> <rule name="Remove Pragma Header"> <match serverVariable="RESPONSE_Pragma" pattern=".+" /> <action type="Rewrite" value="" /> </rule> <rule name="Remove Expires Header"> <match serverVariable="RESPONSE_Expires" pattern=".+" /> <action type="Rewrite" value="" /> </rule> </outboundRules> </rewrite> </system.web>
- 应用程序级事件强制清空头:在
Global.asax的Application_EndRequest事件中添加逻辑,直接清空这两个响应头,确保管道最后阶段不会残留:
protected void Application_EndRequest(object sender, EventArgs e) { Response.Headers.Remove("Pragma"); Response.Headers.Remove("Expires"); }
内容的提问来源于stack exchange,提问作者bogertron
相关产品推荐
相关产品推荐

