遇到访问冲突时,w3wp.exe会反复崩溃并重新启动,直到应用程序池停止

时间:2011-02-08 14:31:58

标签: asp.net clr w3wp

我使用WebHttp绑定(使用[WebGet])在IIS 7.5(Windows Server 2008 R2)中托管了CLR 4 WCF服务。该服务调用以C ++(Visual Studio 2010)实现的非托管组件。

我故意在非托管组件中添加了一个访问冲突(通过反复调用指针上的delete,通过删除指针调用方法等)来测试转储文件生成设置。访问冲突崩溃 w3wp.exe进程,这在CLR 4中考虑“损坏的状态异常”并不奇怪。但是,当进程重新启动时(由于IIS中的预热和永远在线设置),似乎将相同的请求重播到服务,以便它再次崩溃w3wp.exe进程。几次(由“最大故障”应用程序池设置控制)后,应用程序池将停止。

我正在使用浏览器作为测试客户端,当重启序列正在进行时,请求仍在进行中。当应用程序池停止时,请求将返回503 Service Unavailable

我可以通过在代码周围放置try...catch块并使用[HandleProcessCorruptedStateExceptions]属性来解决此问题。当我这样做时,w3wp.exe进程不会崩溃。但是,这不是所希望的行为 - 我希望进程崩溃(访问冲突或内存损坏已经足够糟糕)但我希望它重新启动到干净状态而不重放请求。

我无法使用BasicHttp绑定重现问题。

1 个答案:

答案 0 :(得分:0)

这就是HTTP.sys的工作原理(处理较低级别的http请求的内核驱动程序)。它将请求排队并在池/服务器备份后将它们发送到IIS。