我有一个托管在 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 绑定重现该问题。