2011-02-08 18 views
4

我有一個使用WebHttp綁定(使用[WebGet])在IIS 7.5(Windows Server 2008 R2)中承載的CLR 4 WCF服務。該服務調用一個在C++(Visual Studio 2010)中實現的非託管組件。遇到訪問衝突時,w3wp.exe會重複崩潰並重新啓動,直到應用程序池停止

我故意在非託管組件內部(通過反覆調用delete,通過刪除指針調用方法等)添加訪問衝突來測試轉儲文件生成設置。訪問衝突崩潰 w3wp.exe進程,考慮到CLR 4中的「損壞的狀態異常」並不奇怪。但是,當進程重新啓動(由於IIS中的熱身和始終開啓設置),似乎同樣的請求重播到該服務,以便它再次崩潰w3wp.exe進程。幾次後(由「最大失敗」應用程序池設置管理)應用程序池停止。

我正在使用瀏覽器作爲測試客戶端,並且在重啓序列正在進行中時,請求仍處於運行狀態。當應用程序池停止時,請求返回503 Service Unavailable

我可以通過在代碼周圍放置try...catch塊並使用[HandleProcessCorruptedStateExceptions]屬性來解決此問題。當我這樣做時,w3wp.exe進程不會崩潰。但是,這不是所需的行爲 - 我希望進程崩潰(訪問衝突或內存損壞已足夠糟糕),但我希望它重新啓動到乾淨狀態,並且不會重新請求請求。

我無法使用BasicHttp綁定重現該問題。

+0

請求是否僅僅從正在關閉到新創建的池的進程中彙集,因此導致新池崩潰?我的意思是與請求在服務器上專門重播相反嗎? – 2011-07-26 20:17:32

回答

0

這就是HTTP.sys的工作原理(在較低級別上處理http請求的內核驅動程序)。它將請求排隊並在池/服務器備份後將它們發送到IIS。

相關問題