如何防止ASP.NET / IIS在失败时发送我的http标头

时间:2015-07-02 17:55:11

标签: asp.net iis asp.net-web-api

我有这种情况发生在我的生产环境中,但我无法在我的开发环境中重现。我的WebApi创建一个状态代码为200的响应对象并设置一些标题。

我们发现,如果管理员重新启动IIS,IIS会发回500个错误但保留我的标题。这是一个问题,因为我正在设置缓存标头,在这种情况下,客户端最终缓存500个响应,这实际上不是我想要的。

我认为当IIS决定杀死它们以便能够重新启动时,这仍然在进行中的请求,但我无法证明这一点。

有没有办法确保我永远不会发送500个具有缓存标头的响应?

1 个答案:

答案 0 :(得分:1)

我没有给你答案,但想评论一下:

  

我认为当IIS决定杀死它们以便能够重新启动时,这仍然在进行中的请求,但我无法证明这一点。

使用简单的页面:

<%@ Page Language="C#" debug="true"%>

<script runat="server">                
     void Page_Load() {        
        Response.Headers.Add("Stack","Overflow");
        System.Threading.Thread.Sleep(10000);     
     }
</script>

需要10秒才能执行并添加自定义标头。

普通200的一些响应标头:

Content-Type:text/html
Server:Microsoft-IIS/8.5
Stack:Overflow
X-AspNet-Version:4.0.30319

如果您现在将应用程序池设置为在关闭池之前不等待那么久:

Set-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST'  -filter "system.applicationHost/applicationPools/add[@name='DefaultAppPool']/processModel" -name "shutdownTimeLimit" -value "00:00:03"

无论运行请求是什么,我都告诉IIS在3秒后关闭DefaultAppPool。

现在在浏览器中再次点击我们的页面并执行它。停止游泳池或进行iisreset.exe

现在你得到一个503(不是500)响应头像这样:

Connection:close
Content-Length:326
Content-Type:text/html; charset=us-ascii
Date:Mon, 06 Jul 2015 04:21:31 GMT
Server:Microsoft-HTTPAPI/2.0

请注意,服务器不再是IIS,现在是Microsoft-HTTPAPI,这意味着http.sys是IIS的内核模式部分而不是用户模式部分已经回答了请求。

我们的自定义http标头也不见了。

所有这些意味着您的上述假设不正确,而500响应必须来自其他地方。

您是否在IIS日志中看到了这些500?如果是这样,它们就会在应用程序池消失之前发生。

如果您无法在本地重现问题并且无法在生产框上运行失败的请求跟踪,则可能很难找到正在发生的事情。