Программно получить статус сайта из IIS, возвращает ошибку COM

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

Идентификатор объекта не представляет допустимый объект. (Исключение из HRESULT: 0x800710D8)

Приложение использует класс SiteManager Site для доступа к статусу сайта. Вот код,

//This is fine, gets back the site 
var serverManager = new Microsoft.Web.Administration.ServerManager(ConfigPath);
var site = serverManager.Sites.FirstOrDefault(x => x.Id == 5);
if (site == null) return;
var appPoolName = site.Applications["/"].ApplicationPoolName;
//error!
var state = site.State;

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

Дайте мне знать, если вам нужно больше деталей. Это COM вещь?

2 ответа

Решение

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

Вторая часть диспетчера сервера позволяет подключаться к IIS напрямую, и это происходит путем взаимодействия с элементом COM. Так что я должен делать это:

ServerManager manager= ServerManager.OpenRemote("testserver");
var site = manager.Sites.First();
var status = site.State.ToString() ;

У меня была похожая проблема, но моя была вызвана задержкой, необходимой для активации изменений от вызова CommitChanges на объекте ServerManager. Я нашел ответ, который мне был нужен здесь:

ServerManager CommitChanges вносит изменения с небольшой задержкой

Похоже, опрос необходим для получения последовательных результатов. Нечто подобное решило мою проблему (я получил исключение при доступе к недавно добавленному пулу приложений):

        ...
        create new application pool
        ...
        sman.CommitChanges();
        int i = 0;
        const int max = 10;
        do
        {
            i++;
            try
            {
                if (ObjectState.Stopped == pool.State)
                {
                    write_log("Pool was stopped, starting: " + pool.Name);
                    pool.Start();
                }
                sman.CommitChanges();
                break;
            }
            catch (System.Runtime.InteropServices.COMException e)
            {
                if (i < max)
                {
                    write_log("Waiting for IIS to activate new config...");
                    Thread.Sleep(1000);
                }
                else
                {
                    throw new Exception(
                        "CommitChanges timed out efter " + max + " attempts.",
                        e);
                }
            }
        } while (true);
        ...
Другие вопросы по тегам