У меня есть веб-сервис на одном из моих сайтов, который перезапускает пул приложений для веб-сайтов.
Проблема Im get - это пул приложений IIS7, который останавливается со следующим предупреждением, а затем с ошибкой:
Внимание: Процесс, обслуживающий пул приложений "appPoolNameHere", превысил ограничения во время закрытия.
Ошибка: Пул приложений "appPoolNameHere" автоматически отключается из-за ряда сбоев в процессе (процессах), обслуживающих этот пул приложений.
Код, который я использую для этого:
try
{
var serverManager = new ServerManager();
var currentPoolName = SettingsManager.AppPoolName;
if (!string.IsNullOrEmpty(currentPoolName))
serverManager.ApplicationPools[currentPoolName].Recycle();
HttpRuntime.Close();
}
catch (Exception ex)
{
var exceptionManager = ExceptionManagerFactory.GetExceptionManager();
exceptionManager.LogException(ExceptionManager.Severities.Critical, ex,
"App Pool restart failed");
}
Я не получаю исключения, которые вы выбрасываете здесь, но пул приложений останавливается, это не происходит все время и очень сложно реплицировать, я пробовал несколько разных вещей, даже просто ударяя черт из этой службы, а иногда его прекрасные другие времена он умирает.
Есть ли что-нибудь, что я могу сделать, чтобы исправить это?
Причина, по которой я должен перезапустить его, - это внешний файл конфигурации для webconfig, который связан с перенаправлением URL-адресов, который обновляется из системы администратора.
Спасибо за любую помощь с этим.
Ну, я, кажется, разобрал (не исправил) проблему, с какой-то лентой и липкой пластикой.
Решение
Изменена настройка пула приложений: Быстрая защита от ошибок - false
Это останавливает IIS от убийства пула приложений после нескольких неудачных запросов к нему.
Я также добавил в систему повторных попыток, поэтому, если запрос на рециркуляцию не работает, он ждет 10 секунд и повторяет попытку, он будет делать это 5 раз, прежде чем отказаться от отправки уведомления об исключении.
Это устранило проблему, и все, кажется, снова работает хорошо, хотя что-то об этом кричит, это неправильно! у меня.
Только если IIS будет контролировать другие файлы на веб-сайте и перезапустить пул приложений, когда он увидит изменения.
Я не работал с пространством имен Microsoft.Web.Administration
, но как насчет разгрузки домена приложения и отправки запроса на ваш сайт, чтобы снова запустить приложение?
Хорошо пример (2-й пункт) Питера Бромберга, как это сделать.
Обновить.
Чтение стек ошибок
System.UnauthorizedAccessException: Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))
at Microsoft.Web.Administration.Interop.IAppHostMethodInstance.Execute()
Я думал о наиболее распространенной причине: недостаточно прав. Все административные действия требуют административных прав. Когда выполняется код выше, какая учетная запись пользователя выдана? IUSR? Перейдите к любому администратору для этого блока, и он должен работать без исключения.