如何使用 Microsoft.Web.Administration
作者:Saad Ladki
介绍
IIS 7.0 及更高版本提供了一个全面的托管代码管理应用程序编程接口 (API),它允许完全操作 XML 配置文件,并可方便地访问服务器对象。 本文档逐步讲解如何使用新的管理 API 来修改服务器配置和管理服务器对象。
IIS 包括 Microsoft.Web.Administration,这是一个新的 Web 服务器管理 API,它通过完全操作 XML 配置文件来支持编辑配置。 它还提供了用于管理服务器及其属性和状态的便利对象。 API 的配置编辑方面提供对 IIS 配置文件层次结构和特定配置文件中的读取和写入配置属性的编程访问。 此 API 的对象管理方面提供了一系列顶级管理对象,用于直接管理服务器(例如站点、应用程序池、工作进程等)。
管理类驻留在 Microsoft.Web.Administration 命名空间中。 这些类提供弱类型接口,用于访问配置节和便利对象,这些对象的属性和方法表示配置的属性(如虚拟目录的路径)或要对对象执行的操作(如回收应用程序池)。
创建新网站
以下代码创建一个标题为“Racing Cars Site”的网站及其根应用程序和根虚拟目录。 它还设置网站使用 HTTP 协议在端口 80 上运行,并定义物理路径为 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();
网站对象允许访问网站属性和应用程序。 它还包含将网站添加到系统或获取网站总数的方法。 add 方法还定义了网站名称、根虚拟目录路径和端口号(作为整数)。 另请注意,此调用正在实例化为网站对象 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 中生成以下输出。 与其直接操作 XML 并在元素和属性级别工作,使用服务器管理器对象提供了一种管理 Web 服务器的便捷方法。
<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>
创建新的应用程序池
以下代码修改现有的“Racing Cars 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["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 节调用指定将读取和/或修改的节以及其位置路径。
Configuration config = serverManager.GetApplicationHostConfiguration();
最终结果是对 applicationHost.config 文件进行配置设置,该文件适用于通过位置标记指定的网站。