![](/img/trans.png)
[英]ServerManager.CommitChanges( ) throws Error: “Cannot write configuration file”
[英]Resolve 'configuration object is read only, because it has been committed by a call to ServerManager.CommitChanges()'?
我为安装程序项目编写了一个自定义操作,该操作执行以下操作:
当涉及到分配应用程序池时,我得到并出错:
配置对象是只读的,因为它是通过调用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.