2011-02-08 7 views
4

У меня есть служба 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.

+0

Возможно ли, чтобы запрос просто был перенесен из процесса, который закрывается для вновь созданного пула и, следовательно, приводит к сбою нового пула? Я имею в виду, в отличие от запроса, который специально воспроизводится на сервере? –

+0

Пожалуйста, _confirm_, что это тот же запрос. Запросы автоматически не повторяются, особенно запросы от браузера. –

+0

@John Saunders Да, это та же просьба. –

ответ

0

Как работает HTTP.sys (драйвер ядра, который обрабатывает http-запросы на нижнем уровне). Он отправляет запросы в очередь и отправляет их в IIS после восстановления резервной копии пула/сервера.