我創建了一個C#應用程序,使用Microsoft.Web.Administration.ApplicationPool類一次一個地回收IIS中的所有應用程序池。 ApplicationPool上沒有任何方法來重新啓動應用程序池(如果我錯了,請糾正我),所以我想你只需要停下來,然後開始。這在大部分情況下工作正常,直到我們開始在一個陷入無限循環的應用程序池中獲得一些線程。以編程方式回收IIS7中的應用程序池問題
默認情況下,IIS有90秒的「關閉時間限制」,在它終止任何線程仍在運行之前等待90秒,所以我會調用ApplicationPool.Stop(),並且需要90秒,直到IIS終止應用程序池,它的狀態之前將停止,我可以告訴它重新開始。任何嘗試使用該應用程序池的任何應用程序都會嘗試觸發這些應用程序池的錯誤響應,直到我可以再次啓動該池爲止。
我決定嘗試以編程方式將「關機時間限制」更改爲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錯誤?
你可能不希望聽到這些,但爲什麼在地球上,你會要回收的應用程序池? – 2011-02-23 23:01:40