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