我为执行以下操作的安装程序项目编写了一个自定义操作:
- 检查现有网站以查看是否存在与用户输入的相同名称的网站。
- 如果网站不存在,则在 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();
}
我看不出为什么可以创建站点,创建了应用程序池但未分配。帮助。