Я создал приложение C # для перезапуска всех пулов приложений в IIS, по одному, используя класс Microsoft.Web.Administration.ApplicationPool. В ApplicationPool нет способа перезапустить пул приложений (пожалуйста, исправьте меня, если я ошибаюсь), поэтому я решил, что вам просто нужно сделать остановку, а затем начать. Это работало нормально по большей части, пока мы не начали получать некоторые потоки в пуле приложений, которые застряли в бесконечном цикле.
По умолчанию IIS имеет 90-секундный «предел времени выключения», где он ждет 90 секунд, прежде чем завершит работу всех потоков, которые еще работают, поэтому я вызову ApplicationPool.Stop (), и потребуется 90 секунд, пока IIS не завершит пул приложений, прежде чем его состояние будет остановлено, и я мог сказать ему, чтобы начать снова. Все, что попытается поразить любые приложения, использующие этот пул приложений, получит ответ 503 об ошибке в течение этих 90 секунд, пока я не смогу снова запустить пул.
Я решил попробовать программно изменить «Время отключения» на 5 секунд, чтобы уменьшить количество приложений, которые могут получить ошибку 503, но IIS все еще ждет 90 секунд, прежде чем завершит пул приложений. Ниже моя функция для закрытия пула приложений:
private void StopAppPool(ApplicationPool applicationPool)
{
ObjectState state = applicationPool.State;
TimeSpan previousShutdownTimeLimit = applicationPool.ProcessModel.ShutdownTimeLimit;
applicationPool.ProcessModel.ShutdownTimeLimit = new TimeSpan(0, 0, 5);
switch (state)
{
case ObjectState.Started:
applicationPool.Stop();
WL("Application Pool {0}'s state has gone from {1} to {2}", applicationPool.Name, state, applicationPool.State);
break;
case ObjectState.Starting:
case ObjectState.Unknown:
for (int i = 0; i < 180; i++)
{
WL("Application Pool {0}'s state is {1}. Waiting for state to become Started", applicationPool.Name, state);
Thread.Sleep(500);
state = applicationPool.State;
if (applicationPool.State == ObjectState.Started) { break; }
}
if (state == ObjectState.Started)
{
applicationPool.Start();
WL("Application Pool {0}'s state has gone from {1} to {2}", applicationPool.Name, state, applicationPool.State);
}
else
{
WL("Error starting Application Pool {0}: Application Pool never stopped", applicationPool.Name);
}
break;
case ObjectState.Stopped:
case ObjectState.Stopping:
WL("Application Pool {0} was already in a {1} state and has not been modified", applicationPool.Name, state);
break;
default:
WL("Error stopping Application Pool {0}: Unexpected ObjectState \"{1}\"", applicationPool.Name, state);
break;
}
state = applicationPool.State;
for (int i = 0; i < 180 && state != ObjectState.Stopped; i++)
{
WL("Application Pool {0}'s state is {1}. Waiting for state to become Stopped", applicationPool.Name, state);
Thread.Sleep(500);
state = applicationPool.State;
}
applicationPool.ProcessModel.ShutdownTimeLimit = previousShutdownTimeLimit;
}
Почему ApplicationPool.ProcessModel.ShutdownTimeLimit, по-видимому, не влияет на то, сколько времени требуется IIS для фактического уничтожения пула приложений? В любом случае, чтобы другие приложения не получали ошибки 503 при попытке перезапустить пул приложений?