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