Я пошел немного другим путем с моим кодом, чтобы переработать пул приложений. Обратите внимание на несколько вещей, которые отличаются от того, что предоставили другие:
1) Я использовал оператор using для обеспечения правильного удаления объекта ServerManager.
2) Я жду, пока пул приложений завершит запуск, прежде чем остановить его, чтобы мы не столкнулись с какими-либо проблемами при попытке остановить приложение. Точно так же я жду, пока пул приложений завершит свою работу, прежде чем пытаться его запустить.
3) Я заставляю метод принимать действительное имя сервера вместо того, чтобы обращаться к локальному серверу, потому что я подумал, что вы, вероятно, должны знать, с каким сервером вы работаете с этим.
4) Я решил запустить / остановить приложение, а не перерабатывать его, чтобы убедиться, что мы случайно не запустили пул приложений, остановленный по другой причине, и избежать проблем с попыткой перезапуска уже остановленный пул приложений.
public static void RecycleApplicationPool(string serverName, string appPoolName)
{
if (!string.IsNullOrEmpty(serverName) && !string.IsNullOrEmpty(appPoolName))
{
try
{
using (ServerManager manager = ServerManager.OpenRemote(serverName))
{
ApplicationPool appPool = manager.ApplicationPools.FirstOrDefault(ap => ap.Name == appPoolName);
//Don't bother trying to recycle if we don't have an app pool
if (appPool != null)
{
//Get the current state of the app pool
bool appPoolRunning = appPool.State == ObjectState.Started || appPool.State == ObjectState.Starting;
bool appPoolStopped = appPool.State == ObjectState.Stopped || appPool.State == ObjectState.Stopping;
//The app pool is running, so stop it first.
if (appPoolRunning)
{
//Wait for the app to finish before trying to stop
while (appPool.State == ObjectState.Starting) { System.Threading.Thread.Sleep(1000); }
//Stop the app if it isn't already stopped
if (appPool.State != ObjectState.Stopped)
{
appPool.Stop();
}
appPoolStopped = true;
}
//Only try restart the app pool if it was running in the first place, because there may be a reason it was not started.
if (appPoolStopped && appPoolRunning)
{
//Wait for the app to finish before trying to start
while (appPool.State == ObjectState.Stopping) { System.Threading.Thread.Sleep(1000); }
//Start the app
appPool.Start();
}
}
else
{
throw new Exception(string.Format("An Application Pool does not exist with the name {0}.{1}", serverName, appPoolName));
}
}
}
catch (Exception ex)
{
throw new Exception(string.Format("Unable to restart the application pools for {0}.{1}", serverName, appPoolName), ex.InnerException);
}
}
}