1

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

  • 检查现有网站以查看是否存在与用户输入的相同名称的网站。
  • 如果网站不存在,则在 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();
}

我看不出为什么可以创建站点,创建了应用程序池但未分配。帮助。

4

1 回答 1

2

我终于意识到错误中提到的“配置对象”是“站点”。现在似乎很明显,但基本上我需要重新获取该站点,然后将应用程序池分配给它。我认为这是允许之前的更改发生然后将它们拾起。所以我改变了我的代码,不再需要将 Site 传递给 private void AssignAppPool() 并像这样再次获取该站点:

Site site = mgr.Sites["TestWebApp"];
于 2014-08-19T13:25:32.287 回答