Reiniciar (reciclar) un grupo de aplicaciones

¿Cómo puedo reiniciar (reciclar) el conjunto de aplicaciones de IIS desde C # (.net 2)?

Apreciar si publica código de muestra?

John,

Si está en IIS7 , esto lo hará si se detiene. Supongo que puede ajustar para reiniciar sin tener que mostrarse.

// 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; } 

Si está en IIS6, no estoy tan seguro, pero podría intentar obtener el archivo web.config y editar la fecha de modificación o algo así. Una vez que se realiza una edición en web.config, la aplicación se reiniciará.

Aquí vamos:

 HttpRuntime.UnloadAppDomain(); 

Tal vez estos artículos ayudarán:

  • Recicle el grupo de aplicaciones actual programáticamente (para IIS 6+)
  • Reciclar grupos de aplicaciones usando WMI en IIS 6.0
  • Reciclaje de grupos de aplicaciones de IIS 6.0 mediante progtwigción
  • Programemente reciclar un grupo de aplicaciones IIS

El siguiente código funciona en IIS6. No probado en 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(); } } 

También puede cambiar “Reciclar” para “Comenzar” o “Detener”.

Tomé una ruta ligeramente diferente con mi código para reciclar el grupo de aplicaciones. Algunas cosas para tener en cuenta que son diferentes de lo que otros han proporcionado:

1) Usé una statement de uso para asegurar la correcta eliminación del objeto ServerManager.

2) Estoy esperando que el grupo de aplicaciones termine de comenzar antes de detenerlo, para que no tenga problemas al tratar de detener la aplicación. Del mismo modo, estoy esperando que el grupo de aplicaciones termine de detenerse antes de intentar iniciarlo.

3) Estoy forzando que el método acepte un nombre de servidor real en lugar de volver a caer en el servidor local, porque pensé que probablemente debería saber con qué servidor está ejecutando esto.

4) Decidí iniciar / detener la aplicación en lugar de reciclarla, para poder asegurarme de que no iniciamos accidentalmente un grupo de aplicaciones que se detuvo por otro motivo, y para evitar problemas al tratar de reciclar una ya detenida grupo de aplicaciones.

 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); } } } 

Reciclar código trabajando en IIS6:

  ///  /// Get a list of available Application Pools ///  ///  public static List HentAppPools() { List list = new List(); 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; } ///  /// Recycle an application pool ///  ///  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); } 

A veces siento que lo simple es lo mejor. Y aunque sugiero que uno adapta la ruta real de una manera inteligente para trabajar de una manera más amplia en otros entornos, mi solución se parece a algo como:

 ExecuteDosCommand(@"c:\Windows\System32\inetsrv\appcmd recycle apppool " + appPool); 

Desde C #, ejecuta un comando de DOS que hace el truco. Muchas de las soluciones anteriores no funcionan en varias configuraciones y / o requieren que las características de Windows estén activadas (dependiendo de la configuración).

este código funciona para mí solo llámalo para volver a cargar la aplicación.

 System.Web.HttpRuntime.UnloadAppDomain()