我在 VS2010 中创建了一个不错的自定义安装程序,它不仅可以将网站安装到 IIS,还可以执行一些自定义操作,例如注册 COM Dll 和其他操作。在此过程中,我还使用 Microsoft.Web.Administration 执行以下操作:
- 为网站创建自定义应用程序池,指定.NET Framework 版本、管道模式等...
- 将创建的应用程序池分配给已安装的网站。
我遇到的问题是,当我这样做时:
sm.Sites[0].Applications["/MyNewSite"].ApplicationPoolName = newPool.Name;
sm.CommitChanges();
代码中显示已分配并正常运行(即没有错误),但安装后,我打开 IIS 管理器并查看 Web 应用程序应用程序池 - 应用程序池肯定不是我在代码中分配的。它只是默认应用程序池,但我在代码中创建的应用程序池肯定存在,并具有正确的详细信息和信息。
我不想更改网站应用程序池,而是想更改 Web 应用程序。(即默认网站 > MyNewSite 应用程序池,而不是/默认网站)
我被这个问题困扰了一天多,不明白为什么它不起作用。
我究竟做错了什么?
我正在 WS2008R2 + 所有更新框上安装。IIS 7.5。
谢谢
答案1
您可以尝试以下由 IIS 管理器创建的代码:
using System;
using System.Text;
using Microsoft.Web.Administration;
internal static class Sample {
private static void Main() {
using(ServerManager serverManager = new ServerManager()) {
Configuration config = serverManager.GetApplicationHostConfiguration();
ConfigurationSection sitesSection = config.GetSection("system.applicationHost/sites");
ConfigurationElementCollection sitesCollection = sitesSection.GetCollection();
ConfigurationElement siteElement = FindElement(sitesCollection, "site", "name", @"MySite");
if (siteElement == null) throw new InvalidOperationException("Element not found!");
ConfigurationElementCollection siteCollection = siteElement.GetCollection();
ConfigurationElement applicationElement = FindElement(siteCollection, "application", "path", @"/subsite");
if (applicationElement == null) throw new InvalidOperationException("Element not found!");
applicationElement["applicationPool"] = @"TheAppPool";
serverManager.CommitChanges();
}
}
private static ConfigurationElement FindElement(ConfigurationElementCollection collection, string elementTagName, params string[] keyValues) {
foreach (ConfigurationElement element in collection) {
if (String.Equals(element.ElementTagName, elementTagName, StringComparison.OrdinalIgnoreCase)) {
bool matches = true;
for (int i = 0; i < keyValues.Length; i += 2) {
object o = element.GetAttributeValue(keyValues[i]);
string value = null;
if (o != null) {
value = o.ToString();
}
if (!String.Equals(value, keyValues[i + 1], StringComparison.OrdinalIgnoreCase)) {
matches = false;
break;
}
}
if (matches) {
return element;
}
}
}
return null;
}
}