Перезапуск (переработка) пула приложений
Как я могу перезапустить (переработать) пул приложений IIS с С# (.net 2)?
Знаете ли вы, если вы отправляете образец кода?
Ответы
Ответ 1
Джон
Если вы находитесь на IIS7, тогда это будет сделано, если оно остановлено. Я предполагаю, что вы можете настроить для перезапуска без необходимости отображения.
// Gets the application pool collection from the server.
[ModuleServiceMethod(PassThrough = true)]
public ArrayList GetApplicationPoolCollection()
{
// Use an ArrayList to transfer objects to the client.
ArrayList arrayOfApplicationBags = new ArrayList();
ServerManager serverManager = new ServerManager();
ApplicationPoolCollection applicationPoolCollection = serverManager.ApplicationPools;
foreach (ApplicationPool applicationPool in applicationPoolCollection)
{
PropertyBag applicationPoolBag = new PropertyBag();
applicationPoolBag[ServerManagerDemoGlobals.ApplicationPoolArray] = applicationPool;
arrayOfApplicationBags.Add(applicationPoolBag);
// If the applicationPool is stopped, restart it.
if (applicationPool.State == ObjectState.Stopped)
{
applicationPool.Start();
}
}
// CommitChanges to persist the changes to the ApplicationHost.config.
serverManager.CommitChanges();
return arrayOfApplicationBags;
}
Если вы на IIS6, я не уверен, но вы можете попробовать получить web.config и отредактировать измененную дату или что-то еще. После внесения изменений в файл web.config приложение перезапустится.
Ответ 2
Здесь мы идем:
HttpRuntime.UnloadAppDomain();
Ответ 3
Возможно, эти статьи помогут:
Ответ 4
Код ниже работает на IIS6. Не тестировалось в IIS7.
using System.DirectoryServices;
...
void Recycle(string appPool)
{
string appPoolPath = "IIS://localhost/W3SVC/AppPools/" + appPool;
using (DirectoryEntry appPoolEntry = new DirectoryEntry(appPoolPath))
{
appPoolEntry.Invoke("Recycle", null);
appPoolEntry.Close();
}
}
Вы также можете изменить "Переработать" для "Пуск" или "Стоп".
Ответ 5
Я пошел немного другим путем с моим кодом для утилизации пула приложений. Несколько замечаний, которые отличаются от того, что другие предоставили:
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);
}
}
}
Ответ 6
Код обработки, работающий на IIS6:
/// <summary>
/// Get a list of available Application Pools
/// </summary>
/// <returns></returns>
public static List<string> HentAppPools() {
List<string> list = new List<string>();
DirectoryEntry W3SVC = new DirectoryEntry("IIS://LocalHost/w3svc", "", "");
foreach (DirectoryEntry Site in W3SVC.Children) {
if (Site.Name == "AppPools") {
foreach (DirectoryEntry child in Site.Children) {
list.Add(child.Name);
}
}
}
return list;
}
/// <summary>
/// Recycle an application pool
/// </summary>
/// <param name="IIsApplicationPool"></param>
public static void RecycleAppPool(string IIsApplicationPool) {
ManagementScope scope = new ManagementScope(@"\\localhost\root\MicrosoftIISv2");
scope.Connect();
ManagementObject appPool = new ManagementObject(scope, new ManagementPath("IIsApplicationPool.Name='W3SVC/AppPools/" + IIsApplicationPool + "'"), null);
appPool.InvokeMethod("Recycle", null, null);
}
Ответ 7
Иногда я чувствую, что это просто. И хотя я предлагаю, чтобы кто-то адаптировал фактический путь каким-то умным способом более широко работать на других условиях - мое решение выглядит примерно так:
ExecuteDosCommand(@"c:\Windows\System32\inetsrv\appcmd recycle apppool " + appPool);
Из С# запустите команду DOS, которая выполняет трюк. Многие из вышеперечисленных решений не работают с различными настройками и/или требуют включения функций Windows (в зависимости от настроек).
Ответ 8
этот код работает для меня. просто позвоните ему, чтобы перезагрузить приложение.
System.Web.HttpRuntime.UnloadAppDomain()
Ответ 9
Приведенный ниже метод проверен на работоспособность как для IIS7, так и для IIS8.
Шаг 1: Добавить ссылку на Microsoft.Web.Administration.dll. Файл можно найти по пути C:\Windows\System32\inetsrv\или установить как пакет NuGet https://www.nuget.org/packages/Microsoft.Web.Administration/
Шаг 2: Добавьте приведенный ниже код
using Microsoft.Web.Administration;
Использование Null-условного оператора
new ServerManager().ApplicationPools["Your_App_Pool_Name"]?.Recycle();
ИЛИ ЖЕ
Использование условия if для проверки на ноль
var yourAppPool=new ServerManager().ApplicationPools["Your_App_Pool_Name"];
if(yourAppPool!=null)
yourAppPool.Recycle();
Ответ 10
Другой вариант:
System.Web.Hosting.HostingEnvironment.InitiateShutdown();
Кажется, лучше, чем UploadAppDomain
который "завершает" приложение, в то время как первый ожидает, что материал завершит свою работу.