Restarting (Recycling) an Application Pool

C#.Netasp.net MvcIisApplication Pool

C# Problem Overview


How can I restart(recycle) IIS Application Pool from C# (.net 2)?

Appreciate if you post sample code?

C# Solutions


Solution 1 - C#

Here we go:

HttpRuntime.UnloadAppDomain();

Solution 2 - C#

If you're on IIS7 then this will do it if it is stopped. I assume you can adjust for restarting without having to be shown.

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

If you're on IIS6 I'm not so sure, but you could try getting the web.config and editing the modified date or something. Once an edit is made to the web.config then the application will restart.

Solution 3 - C#

Solution 4 - C#

The code below works on IIS6. Not tested 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();
    }
}

You can change "Recycle" for "Start" or "Stop" also.

Solution 5 - C#

I went a slightly different route with my code to recycle the application pool. A few things to note that are different than what others have provided:

  1. I used a using statement to ensure proper disposal of the ServerManager object.

  2. I am waiting for the application pool to finish starting before stopping it, so that we don't run into any issues with trying to stop the application. Similarly, I am waiting for the app pool to finish stopping before trying to start it.

  3. I am forcing the method to accept an actual server name instead of falling back to the local server, because I figured you should probably know what server you are running this against.

  4. I decided to start/stop the application as opposed to recycling it, so that I could make sure that we didn't accidentally start an application pool that was stopped for another reason, and to avoid issues with trying to recycle an already stopped application pool.

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

    }

Solution 6 - C#

Below method is tested to be working for both IIS7 and IIS8

Step 1 : Add reference to Microsoft.Web.Administration.dll. The file can be found in the path C:\Windows\System32\inetsrv, or install it as NuGet Package https://www.nuget.org/packages/Microsoft.Web.Administration/

Step 2 : Add the below code

using Microsoft.Web.Administration;

Using Null-Conditional Operator

new ServerManager().ApplicationPools["Your_App_Pool_Name"]?.Recycle();

OR

Using if condition to check for null

var yourAppPool=new ServerManager().ApplicationPools["Your_App_Pool_Name"];
if(yourAppPool!=null)
    yourAppPool.Recycle();

Solution 7 - C#

Recycle code working on 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);
    }

Solution 8 - C#

Sometimes I feel that simple is best. And while I suggest that one adapts the actual path in some clever way to work on a wider way on other enviorments - my solution looks something like:

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

From C#, run a DOS command that does the trick. Many of the solutions above does not work on various settings and/or require features on Windows to be turned on (depending on setting).

Solution 9 - C#

this code work for me. just call it to reload application.

System.Web.HttpRuntime.UnloadAppDomain()

Solution 10 - C#

Another option:

System.Web.Hosting.HostingEnvironment.InitiateShutdown();

Seems better than UploadAppDomain which "terminates" the app while the former waits for stuff to finish its work.

Solution 11 - C#

Here is a simple solution if you just want to recycle all the app pools on the current machine. I had to "run as administrator" for this to work.

using (var serverManager = new ServerManager())
{
    foreach (var appPool in serverManager.ApplicationPools)
    {
        appPool.Recycle();
    }
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJohnView Question on Stackoverflow
Solution 1 - C#Nathan RidleyView Answer on Stackoverflow
Solution 2 - C#doveView Answer on Stackoverflow
Solution 3 - C#alexandrulView Answer on Stackoverflow
Solution 4 - C#Ricardo NoldeView Answer on Stackoverflow
Solution 5 - C#SpazmooseView Answer on Stackoverflow
Solution 6 - C#KaarthikeyanView Answer on Stackoverflow
Solution 7 - C#Wolf5View Answer on Stackoverflow
Solution 8 - C#Simply G.View Answer on Stackoverflow
Solution 9 - C#FredView Answer on Stackoverflow
Solution 10 - C#Alex from JitbitView Answer on Stackoverflow
Solution 11 - C#phillhuttView Answer on Stackoverflow