Вопрос

Как я могу перезапустить (переработать) пул приложений IIS с C # (.net 2)?

Буду признателен, если вы опубликуете пример кода?

Это было полезно?

Решение

Джон,

Если вы находитесь на ИИС7 тогда это сделает это, если оно будет остановлено.Я предполагаю, что вы можете настроить перезапуск без необходимости показа.

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

Если вы находитесь на ИИС6 Я не совсем уверен, но вы могли бы попробовать получить web.config и отредактировать измененную дату или что-то в этом роде.Как только в web.config будет внесено изменение, приложение перезапустится.

Другие советы

Вот и мы:

HttpRuntime.UnloadAppDomain();

Приведенный ниже код работает на IIS6. Не проверено в 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();
    }
}

Вы можете изменить " Переработать " для " Начать " или "Стоп" также.

Я пошел немного другим путем с моим кодом, чтобы переработать пул приложений. Обратите внимание на несколько вещей, которые отличаются от того, что предоставили другие:

1) Я использовал оператор using для обеспечения правильного удаления объекта ServerManager.

2) Я жду, пока пул приложений завершит запуск, прежде чем остановить его, чтобы мы не столкнулись с какими-либо проблемами при попытке остановить приложение. Точно так же я жду, пока пул приложений завершит свою работу, прежде чем пытаться его запустить.

3) Я заставляю метод принимать действительное имя сервера вместо того, чтобы обращаться к локальному серверу, потому что я подумал, что вы, вероятно, должны знать, с каким сервером вы работаете с этим.

4) Я решил запустить / остановить приложение, а не перерабатывать его, чтобы убедиться, что мы случайно не запустили пул приложений, остановленный по другой причине, и избежать проблем с попыткой перезапуска уже остановленный пул приложений.

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

Переработайте код, работающий на 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);
    }

Иногда я чувствую, что просто лучше всего. И хотя я предлагаю адаптировать реальный путь каким-то умным способом, чтобы работать более широко на других средах - мое решение выглядит примерно так:

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

Из C # запустите команду DOS, которая добьется цели. Многие из приведенных выше решений не работают с различными настройками и / или требуют включения функций в Windows (в зависимости от настроек).

этот код работает для меня. просто позвоните, чтобы перезагрузить приложение.

System.Web.HttpRuntime.UnloadAppDomain()

Приведенный ниже метод проверен на работоспособность как для IIS7, так и для IIS8

Шаг 1. Добавьте ссылку на Microsoft.Web.Administration.dll . Файл можно найти по пути C: \ Windows \ System32 \ inetsrv \ или установить как пакет NuGet https://www.nuget.org/packages/Microsoft.Web.Administration/

Шаг 2. Добавьте приведенный ниже код

using Microsoft.Web.Administration;

Использование оператора с нулевым условием

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

OR

Использование условия if для проверки на нулевое значение

var yourAppPool=new ServerManager().ApplicationPools["Your_App_Pool_Name"];
if(yourAppPool!=null)
    yourAppPool.Recycle();
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top