Microsoft.Web.Administration.ApplicationPoolクラスを使用して、IISですべてのアプリケーションプールを一度に1つずつリサイクルするC#アプリケーションを作成しました。 ApplicationPoolにはアプリケーションプールを再起動する方法はありません(私が間違っていれば私を修正してください)。だから私はあなたがちょうど停止してから始める必要があると考えました。無限ループに陥っていたスレッドをアプリケーションプールに入れ始めるまで、これはほとんどの場合うまくいきました。IIS7でアプリケーションプールをプログラムでリサイクルする問題
既定では、IISには90秒間の「シャットダウン時間制限」があり、実行中のスレッドが終了するまでに90秒間待機するため、ApplicationPool.Stop()を呼び出すとIIS終了まで90秒かかりますそれが状態になる前にアプリケーションプールを停止し、私はそれが再び始まるように指示することができます。そのアプリケーションプールを使用しているアプリケーションにヒットしようとするものは、プールを再開するまで、90秒間、503エラー応答が返されます。
「シャットダウン時間制限」をプログラムで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エラーを受け取らないようにするにはどうすればいいですか?
あなたはおそらくこれを聞きたくありませんが、なぜ地球上でアプリケーションプールをリサイクルしたいですか? –