Resolve '配置对象是只读的,因为它是通过调用ServerManager.CommitChanges()&
本文关键字:调用 CommitChanges ServerManager 配置 对象 只读 Resolve 因为 | 更新日期: 2023-09-27 18:18:44
我为安装程序项目编写了一个自定义操作,它执行以下操作:
- 检查现有的网站,看看是否存在相同的名称
- 在IIS中创建不存在的网站。
- 创建应用程序池
- 将申请池分配给已创建的网站。
当涉及到分配应用程序池时,我得到和错误:
配置对象是只读的,因为它已经提交通过调用ServerManager.CommitChanges()。如果写访问是
使用ServerManager获取新的引用。
这让我感到困惑,因为它似乎表明我不能用ServerManager.CommitChanges()调用分配新创建的应用程序池。然而,其他一切工作正常使用这个,我不希望这是一个问题。
下面是我的代码:我有一个ServerManager实例创建如下:
private ServerManager mgr = new ServerManager();
在我的Install方法中,我做了以下操作:
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;
}
<<p> CreateWebSite方法/strong>: 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;
}
创建App Pool
//non-relevant code...
ApplicationPool NewPool = mgr.ApplicationPools.Add(ApplicationPool);
NewPool.AutoStart = true;
NewPool.ManagedRuntimeVersion = "4.0";
NewPool.ManagedPipelineMode = ManagedPipelineMode.Classic;
mgr.CommitChanges();
Assign App Pool
private void AssignAppPool(Site site)
{
site.ApplicationDefaults.ApplicationPoolName = ApplicationPool; //ERRORS HERE
mgr.CommitChanges();
}
我不明白为什么一个网站可以创建,一个应用程序池创建,但没有分配。帮助。
我终于意识到错误中所指的"配置对象"是"站点"。现在看起来很明显,但基本上我需要重新获得网站,然后分配应用程序池。我认为这是允许之前的变化发生,然后再把它们捡起来。因此,我修改了我的代码,删除了将Site传递到私有void assignappool()的需要,只是像这样再次获得站点:
Site site = mgr.Sites["TestWebApp"];