解决"配置对象是只读的,因为它是通过调用ServerManager.CommitChanges()提交的"?



我为安装程序项目编写了一个自定义操作,它执行以下操作:

  • 检查现有的网站,看看是否存在相同的名称
  • 在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"];

最新更新