Riavvio (riciclaggio) di un pool di applicazioni

Come posso riavviare (riciclare) il pool di applicazioni IIS da C # (.net 2)?

Apprezzo se pubblichi un codice di esempio?

John,

Se sei su IIS7, questo lo farà se viene fermato. Presumo che puoi regolare per il riavvio senza dover essere mostrato.

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

Se sei su IIS6 non ne sono così sicuro, ma potresti provare a ottenere web.config e modificare la data di modifica o qualcosa del genere. Una volta apportata una modifica a web.config, l’applicazione verrà riavviata.

Eccoci qui:

 HttpRuntime.UnloadAppDomain(); 

Forse questo articolo aiuterà:

  • Riciclare il pool di applicazioni corrente a livello di codice (per IIS 6+)
  • Riciclaggio dei pool di applicazioni tramite WMI in IIS 6.0
  • Riciclaggio di pool di applicazioni IIS 6.0 a livello di codice
  • Riciclare in modo programmatico un pool di applicazioni IIS

Il codice seguente funziona su IIS6. Non testato in 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(); } } 

È anche ansible modificare “Ricicla” per “Avvia” o “Stop”.

Ho seguito un percorso leggermente diverso con il mio codice per riciclare il pool di applicazioni. Alcune cose da notare che sono diverse da quelle fornite dagli altri:

1) Ho usato un’istruzione using per garantire il corretto smaltimento dell’object ServerManager.

2) Sto aspettando che il pool di applicazioni finisca di iniziare prima di fermarlo, in modo che non ci siano problemi con il tentativo di fermare l’applicazione. Allo stesso modo, attendo che il pool di applicazioni finisca di fermarsi prima di provare ad avviarlo.

3) Sto forzando il metodo per accettare un nome di server effettivo invece di ricadere sul server locale, perché ho pensato che probabilmente dovresti sapere su quale server stai eseguendo questo.

4) Ho deciso di avviare / arrestare l’applicazione anziché riciclarla, in modo da assicurarmi che non avessimo accidentalmente avviato un pool di applicazioni che era stato interrotto per un altro motivo, e per evitare problemi con il tentativo di riciclare uno già arrestato pool di applicazioni.

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

Riciclare il codice che funziona su 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 volte mi sembra che sia semplice la cosa migliore. E mentre suggerisco che si adatta il percorso attuale in un modo intelligente per lavorare su un piano più ampio su altri ambienti, la mia soluzione assomiglia a qualcosa:

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

Da C #, esegui un comando DOS che fa il trucco. Molte delle soluzioni sopra riportate non funzionano su varie impostazioni e / o richiedono l’triggerszione di funzionalità su Windows (a seconda dell’impostazione).

questo codice funziona per me. basta chiamarlo per ricaricare l’applicazione.

 System.Web.HttpRuntime.UnloadAppDomain()