Как получить объект ApplicationPool на основе сайта в IIS - PullRequest
1 голос
/ 20 октября 2019

Я создал приложение, которое получает все мои сайты в IIS и проверяет каждый URL в привязках, если есть ошибка HTTP и если обнаружена определенная ошибка, мое приложение сбросит экземпляр сайта IIS в IIS, однаконедостаточно, чтобы исправить ошибку, как следует. Мне нужно будет сбросить и сайт, и пул приложений, к которому он принадлежит.

Есть ли способ получить объект пула приложений на основе объекта сайта?

Я попробовал приведенный ниже код, но это работает только в том случае, если в пуле приложений есть только 1 сайт / приложение. Проблема в том, что я не получаю соответствующий пул приложений сайта, если у меня есть несоответствие числа между списком сайтов и списком приложений, так как 1 AppPool может иметь несколько сайтов / приложений.

ServerManager serverMgr = new ServerManager();
SiteCollection sites;
ApplicationPoolCollection appPools;
public List<(Site, ApplicationPool, string)> getSiteInfo()
{
    List<(Site, ApplicationPool, string)> siteInfo = new List<(Site, ApplicationPool, string)>();
    List<string> siteUrls = new List<string>();
    sites = serverMgr.Sites;
    appPools = serverMgr.ApplicationPools;
    foreach (Site site in sites)
    {
        foreach (ApplicationPool appPool in appPools)
        {
            foreach (Binding binding in site.Bindings)//getting site url
            {
                string bindingInfo = binding.BindingInformation; // "192.111.1.1:80:google.com" /// *:808:
                string[] adrs = bindingInfo.Split(':'); //0 = ip, 1 = port, 2 = hostname
                if (adrs[0] == "*")
                {
                    adrs[0] = "localhost";
                }
                //adding to my list of sites and it's corresponding Application Pool in 1 tuple variable
                siteInfo.Add((site, appPool, adrs[0] + ":" + adrs[1] + "/" + adrs[2])); //localhost:80/google.com 
            }
        }
    }
    return siteInfo;
}

Мне нужно что-то похожее на этот код: (см. Комментарии)

public List<(Site, ApplicationPool, string)> getSiteInfo()
{
    List<(Site, ApplicationPool, string)> siteInfo = new List<(Site, ApplicationPool, string)>();
    List<string> siteUrls = new List<string>();
    sites = serverMgr.Sites;
    foreach (Site site in sites)
    {
        foreach (Binding binding in site.Bindings)
        {
            //I need something like this to make sure the AppPool I'm getting is of the Site I have.
            ApplicationPool appPool = site.ApplicationPoolName;//<-- This Line
            string bindingInfo = binding.BindingInformation;
            string[] adrs = bindingInfo.Split(':');
            if (adrs[0] == "*")
            {
                adrs[0] = "localhost";
            }
            //So that I can do this when passing the Site Info tuple Variable with the Site Object together with the corresponding AppPool for later use of the IISReset Class in my project.
            siteInfo.Add((site, appPool, adrs[0] + ":" + adrs[1] + "/" + adrs[2]));
        }
    }
    return siteInfo;
}

Извините за длинное и неаккуратное объяснение, но я был бы рад выяснить, если у вас есть вопросы сэто. Спасибо.

1 Ответ

0 голосов
/ 13 ноября 2019

Я понял это с помощью атрибута Приложения сайта. Чтобы получить пул приложений сайта, я сделал код ниже. Где я получил список приложений сайта и использовал его для идентификации пула приложений из списка пулов приложений на сервере. Однако это работает только в том случае, если на сайте есть только 1 приложение, поэтому я индексирую 0 (ноль), чтобы получить первое приложение (которое является единственным приложением моего сайта) для поиска соответствующего пула приложений.

ApplicationCollection apps = site.Applications;
ApplicationPool appPool = serverMgr.ApplicationPools[appname[0].ApplicationPoolName];
...