8 ответов:
Джон
Если вы 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 Я не так уверен, но вы могли бы попробовать получить в интернете.настройка и редактирование измененной даты или что-то в этом роде. После того, как редактирование производится в интернете.config затем приложение будет перезапущено.
приведенный ниже код работает на 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(); } }вы также можете изменить "Recycle" на "Start" или "Stop".
Я пошел немного другим путем с моим кодом, чтобы переработать пул приложений. Несколько вещей, чтобы отметить, что отличаются от того, что другие предоставили:
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); } } }
Recycle код, работающий на 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);из C#, запустите команду DOS, которая делает трюк. Многие из приведенных выше решений не работают с различными настройками и / или требуют включения функций в Windows (в зависимости от настроек).
этот код работает для меня. просто позвоните ему, чтобы перезагрузить приложение.
System.Web.HttpRuntime.UnloadAppDomain()
Comments