C# 解决';配置对象是只读的,因为它已通过调用ServerManager.CommitChanges()';提交;?
我已经为安装程序项目编写了一个自定义操作,该操作执行以下操作:C# 解决';配置对象是只读的,因为它已通过调用ServerManager.CommitChanges()';提交;?,c#,iis-7,custom-action,servermanager,C#,Iis 7,Custom Action,Servermanager,我已经为安装程序项目编写了一个自定义操作,该操作执行以下操作: Site site = CreateWebsite(); if (site != null) { CreateApplicationPool(); AssignAppPool(site); } 检查现有网站,查看是否存在同名网站 由用户输入 在IIS中创建不存在的网站 创建应用程序池 将应用程序池分配给创建的网站 在分配我获得的应用程序池时,出现以下错误: 配置对象是只读的,因为它已提交 通过调用ServerM
Site site = CreateWebsite();
if (site != null)
{
CreateApplicationPool();
AssignAppPool(site);
}
- 检查现有网站,查看是否存在同名网站 由用户输入
- 在IIS中创建不存在的网站
- 创建应用程序池
- 将应用程序池分配给创建的网站
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;
}
创建网站方法:
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();
}
分配应用程序池
//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();
}
我不明白为什么可以创建一个站点,创建一个应用程序池,但却没有分配。帮助。我终于意识到错误中提到的“配置对象”是“站点”。现在看起来很明显,但基本上我需要重新获取站点,然后将应用程序池分配给它。我认为这是允许以前的更改发生,然后再进行更改。因此,我修改了代码,不再需要将站点传递到私有void AssignAppPool()中,只需重新获取站点,如下所示:
Site site = mgr.Sites["TestWebApp"];