Microsoft.Web.Administration 和应用程序池没有设置?

Microsoft.Web.Administration 和应用程序池没有设置?

我在 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;
     }
 }

相关内容