2008-10-30 6 views

Antwort

49

John,

Wenn Sie auf IIS7 sind dann wird dies es tun, wenn es gestoppt wird. Ich nehme an, dass Sie für den Neustart anpassen können, ohne angezeigt zu werden.

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

Wenn Sie auf IIS6 sind Ich bin nicht so sicher, aber man könnte versuchen, die web.config bekommen und die Bearbeitung der Änderungsdatum oder so etwas. Sobald eine Änderung an der web.config vorgenommen wurde, wird die Anwendung neu gestartet.

+3

Oh, gehen Sie voran und zeigen Sie ihm, wie man für den Neustart anpassen. Weißt du, wie man es macht? – DOK

+0

+1 Sie sind der Mann. Nach nicht weniger als 10 Lösungen (einschließlich der Berührung von web.config) war dies der Winnar. – ashes999

+3

Hallo, das ist ein sehr alter Beitrag, aber ich habe Mühe, einen Teil heraus zu finden. Woher kommt "ServerManagerDemoGlobals.ApplicationPoolArray"? d. h. worauf soll ich Bezug nehmen, um darauf zuzugreifen? Ich habe Verweise auf Microsoft.Web.Management.dll und Microsoft.Web.Administration.dll hinzugefügt. Danke – Jon

5

Recycling-Code arbeiten an 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); 
    } 
7

Der folgende Code funktioniert auf IIS6. Nicht in IIS7 getestet.

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

Sie können "Recycle" auch für "Start" oder "Stop" ändern. Hier

+0

Laut http://stackoverflow.com/q/511263/#1762770 funktioniert es auch in IIS7. –

+4

Beachten Sie, dass "IIS 6 WMI Compatibility" auf IIS7 aktiviert sein muss. – Gabriel

76

we go:

HttpRuntime.UnloadAppDomain(); 
+12

Die Anwendung wird wiederverwendet, aber ich bin mir nicht sicher, ob der gesamte App-Pool wiederverwendet wird (der mehrere Anwendungen gleichzeitig hosten kann). –

+0

@Marc - sehr gültig, obwohl Sie sich manchmal nur um den aktuellen Anwendungskontext kümmern. Die Bedingungen, die die Notwendigkeit zum Nachladen anzeigen, können sich jeweils unabhängig voneinander durchsetzen. –

+1

Sehr hilfreich, ich habe das gebraucht! (Ich brauche es nur für den aktuellen Kontext) –

1

Manchmal habe ich das Gefühl, dass einfach am besten ist. Und während ich vorschlagen, dass ein den tatsächlichen Pfad in einigen cleveren Art und Weise passt sich auf andere enviorments auf breiterer Weg zur Arbeit - meine Lösung sieht ungefähr so ​​aus:

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

Von C#, ein DOS-Befehl ausführen, funktioniert der Trick. Viele der obigen Lösungen funktionieren nicht mit verschiedenen Einstellungen und/oder erfordern das Aktivieren von Funktionen unter Windows (je nach Einstellung).

+0

Dies ist besonders, wenn Sie Unbekannte Fehler 0x80005000 von einer der anderen Lösungen versuchen. Das sind alle auf ihre Art gut. –

+1

Ich empfehle dies, wie Sie Ihre eigene "ExecuteDosCommand" -Methode machen. http://www.codeproject.com/Articles/25983/How-to-Execute-a-Command-in-C –

+0

Wie würden Sie den obigen Befehl ausführen, wenn Sie es auf einem Remote-Server ausführen? – Baahubali

6

Ich ging eine etwas andere Route mit meinem Code, um den Anwendungspool zu recyceln. Ein paar Dinge zu beachten, die anders sind als was andere zur Verfügung gestellt haben:

1) Ich habe eine using-Anweisung verwendet, um die ordnungsgemäße Entsorgung des ServerManager-Objekts sicherzustellen.

2) Ich warte darauf, dass der Anwendungspool den Startvorgang beendet, bevor er beendet wird, sodass beim Versuch, die Anwendung zu stoppen, keine Probleme auftreten. Entsprechend warte ich darauf, dass der App-Pool beendet wird, bevor ich versuche, ihn zu starten.

3) Ich erzwinge die Methode, einen tatsächlichen Servernamen zu akzeptieren, anstatt auf den lokalen Server zurückzufallen, weil ich dachte, dass Sie wahrscheinlich wissen sollten, auf welchem ​​Server Sie dies ausführen.

4) Ich entschied mich, die Anwendung zu starten/zu stoppen, anstatt sie zu recyceln, damit ich nicht versehentlich einen Anwendungspool starten konnte, der aus einem anderen Grund angehalten wurde, und Probleme mit dem Versuch zu vermeiden einen bereits gestoppten Anwendungspool recyceln.

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

funktioniert gut auf meinem iis8, fehlerfrei müssen nur Verweis Microsoft.Web.Administration wie erwähnt hinzufügen. – sairfan

0

dieser Code funktioniert für mich. rufen Sie es einfach auf, um die Anwendung neu zu laden.

System.Web.HttpRuntime.UnloadAppDomain()