Разрешить "объект конфигурации доступен только для чтения, поскольку он был зафиксирован вызовом 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();
}

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

1 ответ

Решение

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

Site site = mgr.Sites["TestWebApp"];
Другие вопросы по тегам