4

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

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

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

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

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

4

1 回答 1

0

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

于 2015-05-04T17:08:15.210 回答