У меня есть служба CLR 4 WCF, размещенная в IIS 7.5 (Windows Server 2008 R2) с использованием привязки WebHttp (с [WebGet]
). Служба вызывает в неуправляемый компонент, реализованный в C ++ (Visual Studio 2010).
Я намеренно добавил нарушение доступа внутри неуправляемого компонента (путем многократного вызова delete
для указателя, вызова методов через удаленный указатель и т. Д.) Для проверки параметров генерации файла дампа. Нарушение доступа приводит к сбою процесса w3wp.exe, что неудивительно, если учесть «Исключения из-за поврежденного состояния» в CLR 4. Однако при перезапуске процесса (из-за параметров прогрева и всегда включенного в IIS) Похоже, что тот же запрос воспроизводится в службе, так что он снова завершает процесс w3wp.exe. Через несколько раз (определяется параметром пула приложений "max failures") пул приложений останавливается.
Я использую браузер в качестве тестового клиента, и пока выполняется последовательность перезапусков, запрос все еще находится в полете. Когда пул приложений остановлен, запрос возвращается с 503 Service Unavailable
.
Я могу обойти эту проблему, поместив блок try...catch
вокруг кода и используя атрибут [HandleProcessCorruptedStateExceptions]
. Когда я это делаю, процесс w3wp.exe не падает. Однако это нежелательное поведение - я хочу, чтобы процесс завершился сбоем (нарушение доступа или повреждение памяти является достаточно серьезным), но я хочу, чтобы он перезапустился в чистом состоянии и не воспроизводил запрос.
Мне не удалось воспроизвести проблему с помощью привязки BasicHttp.