Как я могу перезапустить (переработать) пул приложений IIS с С# (.net 2)?
Знаете ли вы, если вы отправляете образец кода?
Как я могу перезапустить (переработать) пул приложений IIS с С# (.net 2)?
Знаете ли вы, если вы отправляете образец кода?
Джон
Если вы находитесь на 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 приложение перезапустится.
Здесь мы идем:
HttpRuntime.UnloadAppDomain();
Возможно, эти статьи помогут:
Код ниже работает на 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();
}
}
Вы также можете изменить "Переработать" для "Пуск" или "Стоп".
Я пошел немного другим путем с моим кодом для утилизации пула приложений. Несколько замечаний, которые отличаются от того, что другие предоставили:
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);
}
}
}
Код обработки, работающий на 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);
}
Иногда я чувствую, что это просто. И хотя я предлагаю, чтобы кто-то адаптировал фактический путь каким-то умным способом более широко работать на других условиях - мое решение выглядит примерно так:
ExecuteDosCommand(@"c:\Windows\System32\inetsrv\appcmd recycle apppool " + appPool);
Из С# запустите команду DOS, которая выполняет трюк. Многие из вышеперечисленных решений не работают с различными настройками и/или требуют включения функций Windows (в зависимости от настроек).
этот код работает для меня. просто позвоните ему, чтобы перезагрузить приложение.
System.Web.HttpRuntime.UnloadAppDomain()
Приведенный ниже метод проверен на работоспособность как для 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();
Другой вариант:
System.Web.Hosting.HostingEnvironment.InitiateShutdown();
Кажется, лучше, чем UploadAppDomain
который "завершает" приложение, в то время как первый ожидает, что материал завершит свою работу.