Разрешить «объект конфигурации доступен только для чтения, поскольку он был зафиксирован вызовом ServerManager.CommitChanges ()»?

Я написал пользовательское действие для проекта установщика, которое делает следующее:

  • Проверяет существующие веб-сайты, чтобы увидеть, существуют ли какие-либо с тем же именем, которое ввел пользователь.
  • Создает веб-сайт в IIS, если он не существует.
  • Создает пул приложений.
  • Назначает пул приложений созданному веб-сайту.

Когда дело доходит до назначения пула приложений, я получаю ошибку:

Объект конфигурации доступен только для чтения, так как он был зафиксирован вызовом ServerManager.CommitChanges(). Если требуется доступ для записи, используйте ServerManager для получения новой ссылки.

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

Вот мой код:

У меня есть экземпляр ServerManager, созданный так:

private ServerManager mgr = new ServerManager();

В моем методе установки я делаю следующее:

Site site = CreateWebsite();
if (site != null)
{
    CreateApplicationPool();
    AssignAppPool(site);
}

Проверка существующих веб-сайтов — выполняется в методе OnBeforeInstall

    private Site CheckWebsites()
    {
        SiteCollection sites = null;
        Site site = null;

        try
        {
            sites = mgr.Sites;
            foreach (Site s in sites)
            {
                if (!string.IsNullOrEmpty(s.Name))
                {
                    if (string.Compare(s.Name, targetSite, true) == 0) site = s;
                }
            }
        }
        catch{}

        return site;
    }

Метод CreateWebSite:

    private Site CreateWebsite()
    {
        Site site = CheckWebsites();

        if (site == null)
        {
            SiteCollection sites = mgr.Sites;
            int port;
            Int32.TryParse(targetPort, out port);
            site = sites.Add(targetSite, targetDirectory, port);
            mgr.CommitChanges();
        }
        else
        {
            //TO DO - if website already exists edit settings
        }

        return site;
    }

Создать пул приложений

//non-relevant code...

ApplicationPool NewPool = mgr.ApplicationPools.Add(ApplicationPool);
NewPool.AutoStart = true;
NewPool.ManagedRuntimeVersion = "4.0"; 
NewPool.ManagedPipelineMode = ManagedPipelineMode.Classic;
mgr.CommitChanges();

Назначить пул приложений

private void AssignAppPool(Site site)
{
    site.ApplicationDefaults.ApplicationPoolName = ApplicationPool; //ERRORS HERE
    mgr.CommitChanges();
}

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


person sr28    schedule 19.08.2014    source источник


Ответы (1)


Я наконец понял, что «объект конфигурации», на который ссылается ошибка, был «сайтом». Теперь это кажется очевидным, но в основном мне нужно было повторно получить сайт, чтобы затем назначить ему пул приложений. Я думаю, что это позволит предыдущим изменениям произойти, а затем забрать их. Поэтому я изменил свой код, убрав необходимость передавать сайт в private void AssignAppPool() и просто снова получив сайт следующим образом:

Site site = mgr.Sites["TestWebApp"];
person sr28    schedule 19.08.2014