Redémarrage (recyclage) d’un pool d’applications

Comment redémarrer (recycler) le pool d’applications IIS à partir de C # (.net 2)?

Appréciez si vous publiez un exemple de code?

    John,

    Si vous êtes sur IIS7, cela le fera s’il est arrêté. Je suppose que vous pouvez ajuster pour redémarrer sans avoir à être montré.

    // 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 vous êtes sur IIS6, je n’en suis pas sûr, mais vous pouvez essayer d’obtenir le fichier web.config et modifier la date de modification ou autre. Une fois la modification effectuée sur web.config, l’application redémarre.

    Et c’est parti:

     HttpRuntime.UnloadAppDomain(); 

    Peut-être que ces articles aideront:

    • Recyclez le pool d’applications actuel par programmation (pour IIS 6+)
    • Recyclage des pools d’applications à l’aide de WMI dans IIS 6.0
    • Recyclage des pools d’applications IIS 6.0 par programme
    • Recycler par programme un pool d’applications IIS

    Le code ci-dessous fonctionne sur IIS6. Non testé dans IIS7.

     using System.DirectoryServices; ... void Recycle(ssortingng appPool) { ssortingng appPoolPath = "IIS://localhost/W3SVC/AppPools/" + appPool; using (DirectoryEntry appPoolEntry = new DirectoryEntry(appPoolPath)) { appPoolEntry.Invoke("Recycle", null); appPoolEntry.Close(); } } 

    Vous pouvez également modifier “Recycler” pour “Démarrer” ou “Arrêter”.

    J’ai utilisé un code légèrement différent pour recycler le pool d’applications. Quelques points à noter qui sont différents de ce que les autres ont fourni:

    1) J’ai utilisé une instruction using pour assurer une élimination correcte de l’object ServerManager.

    2) J’attend que le pool d’applications ait fini de démarrer avant de l’arrêter, afin de ne pas rencontrer de problèmes lors de la tentative d’arrêt de l’application. De même, j’attends que le pool d’applications se termine avant d’essayer de le démarrer.

    3) Je force la méthode à accepter un nom de serveur réel au lieu de retomber sur le serveur local, car je pensais que vous deviez probablement savoir contre quel serveur vous exécutez.

    4) J’ai décidé de lancer / arrêter l’application plutôt que de la recycler, afin de pouvoir faire en sorte de ne pas démarrer accidentellement un pool d’applications arrêté pour une autre raison et d’éviter les problèmes de recyclage d’un produit déjà arrêté. pool d’applications.

     public static void RecycleApplicationPool(ssortingng serverName, ssortingng appPoolName) { if (!ssortingng.IsNullOrEmpty(serverName) && !ssortingng.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(ssortingng.Format("An Application Pool does not exist with the name {0}.{1}", serverName, appPoolName)); } } } catch (Exception ex) { throw new Exception(ssortingng.Format("Unable to restart the application pools for {0}.{1}", serverName, appPoolName), ex.InnerException); } } } 

    Code de recyclage fonctionnant sur 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(ssortingng 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); } 

    Parfois, je pense que c’est simple. Et bien que je propose que l’on adapte le chemin de manière intelligente pour travailler plus largement sur d’autres environnements – ma solution ressemble à ceci:

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

    À partir de C #, exécutez une commande DOS qui fait l’affaire. La plupart des solutions ci-dessus ne fonctionnent pas avec divers parameters et / ou nécessitent que les fonctionnalités de Windows soient activées (en fonction des parameters).

    Ce code fonctionne pour moi. il suffit de l’appeler pour recharger l’application.

     System.Web.HttpRuntime.UnloadAppDomain()