繁体   English   中英

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

[英]Resolve 'configuration object is read only, because it has been committed by a call to 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;
    }

CreateWebSite方法

    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();
}

我看不到为什么可以创建一个网站,创建一个应用程序池,然后又没有分配。 救命。

我终于意识到错误中提到的“配置对象”是“站点”。 现在似乎很明显,但是基本上我需要重新获得该站点,然后将应用程序池分配给它。 我认为这是允许进行先前的更改,然后进行选择。 因此,我更改了代码,不再需要将网站传递到私有void AssignAppPool()中,而只是再次获得该网站,如下所示:

Site site = mgr.Sites["TestWebApp"];

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM