通过


如何使用 Microsoft.Web.Administration

作者 :Saad Ladki

介绍

IIS 7.0 及更高版本提供全面的托管代码管理应用程序编程接口(API),可完全操作 XML 配置文件,并方便访问服务器对象。 本文档逐步讲解如何使用新的管理 API 来修改服务器配置和管理服务器对象。

IIS 包括 Microsoft.Web.Administration,这是 Web 服务器的一个新的管理 API,它允许通过完全操作 XML 配置文件来编辑配置。 它还提供了用于管理服务器及其属性和状态的便利对象。 API 的配置编辑方面提供对 IIS 配置文件层次结构和特定配置文件中的读取和写入配置属性的编程访问。 此 API 的对象管理方面提供了一系列顶级管理对象,用于直接管理服务器(例如站点、应用程序池、工作进程等)。

管理类驻留在 Microsoft.Web.Administration 命名空间中。 这些类提供弱类型接口,用于访问配置节和便利对象,这些对象具有属性和方法,这些属性和方法表示配置的属性(如虚拟目录的路径)或对对象执行的操作(如回收应用程序池)。

创建新网站

以下代码创建一个标题为“赛车网站”的网站及其根应用程序和根虚拟目录。 它还将站点设置为在端口 80 上使用 HTTP 协议,并在 d:\inetput\wwwroot\racing 中定义物理路径。

using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Web.Administration;
namespace MSWebAdmin_Application
{       
    class Program
    {
        static void Main(string[] args)
        {
            ServerManager serverManager = new ServerManager();
            Site mySite = serverManager.Sites.Add("Racing Cars Site", "d:\\inetpub\\wwwroot\\racing",  8080);
            mySite.ServerAutoStart = true;
            serverManager.CommitChanges();
         }
    }
}

ServerManager 是一个工厂类,其中包含一组便于操作的服务器对象,可以通过强类型方式使用其属性和方法。 它是管理服务器的主要入口点。 可以通过其他繁琐的路由(访问原始配置 XML 或调用状态 API)来管理服务器,但通过管理服务器的这些对象是无缝的。 最常见的对象集可通过服务器管理器使用:应用程序、虚拟目录、站点、辅助进程和应用程序域。

ServerManager serverManager = new ServerManager();

sites 对象允许访问网站属性和应用程序。 它还包含将站点添加到系统或获取站点总数的方法。 add 方法还定义站点的名称、根虚拟目录路径和端口号作为整数。 另请注意,此调用正在实例化为 Site 对象 mySite,然后我们可以直接修改其属性来处理新创建的网站。

Site mySite = serverManager.Sites.Add("Racing Cars Site", "d:\\inetpub\\wwwroot\\racing",  8080);

方便对象使修改属性变得简单。 通过从 mySite 对象访问属性,可以直接将网站的自动启动属性设置为“true”,而无需了解任何特定的 XML 属性或元素概念。

mySite.ServerAutoStart = true;

此外,用于修改自动启动属性的另一种方法是不创建站点对象。 而是当网站创建后立即获取该网站,并直接修改其属性。 管理对象使用索引器的概念按名称或索引等键搜索特定对象,而无需进行昂贵的调用来列出整个对象集。 通过定义名称,可以获取特定对象并对其执行操作。

serverManager.Sites["Racing Cars Site"].ServerAutoStart = true;

为进行更新,如果配置有所更改,提交更改将调用执行事务,将配置序列化到磁盘。

serverManager.CommitChanges();

执行上述代码会在节中的 applicationHost.config 生成以下输出。 使用服务器管理器对象来管理 Web 服务器,这提供了一种比直接操作 XML 并在元素和属性级别工作更便捷的方法。

<site name="Racing Cars Site" id="2" serverAutoStart="true"> 
    <application path="/"> 
        <virtualDirectory path="/" physicalPath="d:\inetpub\wwwroot\racing" /> 
    </application> 
    <bindings> 
        <binding protocol="http" bindingInformation=":8080:" /> 
    </bindings> 
</site>

创建新的应用程序池

以下代码修改现有的“赛车网站”,并更改其名称和物理路径,网址为 d:\inetput\wwwroot\racing。 它还会创建新的应用程序池,定义一些属性,将赛车网站设置为使用此池,最后将其回收。

using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Web.Administration;
namespace MSWebAdmin_Application
{       
    class Program
    {
        static void Main(string[] args)
        {
            ServerManager serverManager = new ServerManager();
            Site site = serverManager.Sites["Racing Cars Site"];
            site.Name = "Racing Site";
            site.Applications[0].VirtualDirectories[0].PhysicalPath = "d:\\racing";
            serverManager.ApplicationPools.Add("RacingApplicationPool");
            serverManager.Sites["Racing Site"].Applications[0].ApplicationPoolName = "RacingApplicationPool";
            ApplicationPool apppool = serverManager.ApplicationPools["RacingApplicationPool"];
            apppool.ManagedPipelineMode = ManagedPipelineMode.ISAPI;
            serverManager.CommitChanges();
            apppool.Recycle();
        }
    }
}

与其通过编制索引来获取网站,不如实例化一个网站对象并设置对其的引用。 设置引用后,可以调用网站对象的方法(在本例中为名称)直接重命名网站。

Site site = serverManager.Sites["Racing Cars Site"];
site.Name = "Racing Site";

下面是索引器的另一个用法,用于获取根应用程序,然后获取根目录,并在其上设置物理路径。

site.Applications[0].VirtualDirectories[0].PhysicalPath = "d:\\racing";

除了站点对象之外,我们还有一个应用程序池对象,它提供了一种方便的方式来获取和设置配置属性,以及处理状态方法和数据。 将创建一个新的应用程序池,然后立即将站点置于该应用程序池上。

serverManager.ApplicationPools.Add("RacingApplicationPool");
serverManager.Sites["Racing Site"].Applications[0].ApplicationPoolName = "RacingApplicationPool";

与服务器管理器站点对象一样,服务器管理器应用程序池对象允许你创建应用程序池对象并设置对它的引用。 还可以获取和设置属性并调用方法。

通过更新调用将应用程序池配置数据序列化到文件后,即可对该文件执行回收方法。 不需要此回收调用,因为只需创建应用程序池,就不需要了。 这说明,只有在对象被序列化到磁盘后,才能对其执行操作,服务器可以提取这些配置并根据进行操作。

ApplicationPool apppool = serverManager.ApplicationPools["RacingApplicationPool"];
apppool.ManagedPipelineMode = ManagedPipelineMode.ISAPI;
serverManager.CommitChanges();
apppool.Recycle();

执行上述代码会在节中的 applicationHost.config 生成以下输出。 与其直接操作 XML 并在元素和属性级别进行工作,不如使用服务器管理器对象,这提供了一种便捷的方法来管理 Web 服务器。

<site name="Racing Site" id="2" serverAutoStart="true"> 
    <application path="/"> 
        <virtualDirectory path="/" physicalPath="d:\racing" /> 
    </application> 
    <bindings> 
        <binding protocol="http" bindingInformation=":8080:" /> 
    </bindings> 
</site>

此外,以下更改发生在该部分:

<add name="RacingApplicationPool" managedPipelineMode="ISAPI" />

在站点根 web.config 中设置配置

对于网站“默认网站”,以下代码将该部分的“enabled”属性设置为 false。

using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Web.Administration;
namespace MSWebAdmin_Application
{
    class Program
    {
        static void Main(string[] args)
        {
            ServerManager serverManager = new ServerManager();
            Configuration config =
            mgr.GetWebConfiguration("Default Web Site");
            ConfigurationSection section = config.GetSection("system.webServer/defaultDocument");
            ConfigurationAttribute enabled = section.GetAttribute("enabled");
            enabled.Value = true;
            serverManager.CommitChanges();
        }
    }
}

配置是一个类,用于访问系统中的配置节。 根据获取配置的不同调用,可以访问 applicationHost.config、web.config、administration.config 或任何其他配置文件。 GetWebConfiguration 调用专门获取给定站点(默认网站)和特定路径 (根)的 web.config 文件。

Configuration config = serverManager.GetWebConfiguration("Default Web Site");

一旦获取了 web.config 文件(如果不存在,则创建),就会调用该方法以获取某个配置部分。 我们正在查找该部分,以便将其禁用。 即使 web.config 文件不存在(或者该文件确实存在,但未显式设置分区),仍存在应用于站点级别的有效配置。 这是将被覆盖的配置。

ConfigurationSection section = config.GetSection("system.webServer/defaultDocument");

通过使用节对象上的方法,可以获取已启用的属性,然后通过 value 方法设置其值。 只有在服务器管理器中调用提交更改方法后,才会将更改序列化并保存到磁盘,并立即由服务器选取。 如果配置对象有多个实例,则调用服务器管理器上的提交更改会将所有对象保存到磁盘。

ConfigurationAttribute enabled = section.GetAttribute("enabled");
enabled.Value = true;    
serverManager.CommitChanges();

使用索引器来从节获取和设置属性数据是另一种选项。 获取 section 对象后,可以使用以下代码行来设置启用的属性值。

section["enabled"] = true;

最终结果是在指定的站点的 web.config 文件上设置的配置。

在 applicationHost.config 中为站点设置配置

对于网站“默认网站”,以下代码将该部分的“enabled”属性设置为 false。

using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Web.Administration;

namespace MSWebAdmin_Application
{
    class Program
    {
        static void Main(string[] args)
        {
            ServerManager serverManager = new ServerManager();
            Configuration config = serverManager.GetApplicationHostConfiguration();
            ConfigurationSection section = config.GetSection("system.webServer/defaultDocument","Default Web Site");
            ConfigurationAttribute enabled = section.GetAttribute("enabled");
            enabled.Value = false;
            serverManager.CommitChanges();
        }
    }
}

此代码实际上与上一个任务相同;唯一的区别是配置管理器调用,通过 GetApplicationHostconfiguration 获取 applicationHost.config 文件。

注释

调用 get section 是指定将读取和/或修改的节以及其路径位置的调用。

Configuration config = serverManager.GetApplicationHostConfiguration();

最终结果是在 applicationHost.config 文件中基于位置标记设置的配置,应用于指定的站点。