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中创建不存在的网站
  • 创建应用程序池
  • 将应用程序池分配给创建的网站
在分配我获得的应用程序池时,出现以下错误:

配置对象是只读的,因为它已提交 通过调用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;
    }
创建网站方法

    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"];