Microsoft.Web.Administration の使用方法

発行日 : 2007 年 11 月 23 日 (作業者 : saad(英語))
更新日 : 2008 年 2 月 26 日 (作業者 : saad(英語))

はじめに

IIS 7.0 では、XML 構成ファイルの完全な操作とサーバー オブジェクトへの便利なアクセスを可能にする、包括的なマネージ コード管理用のアプリケーション プログラミング インターフェイス (API) が提供されます。このドキュメントでは、新しい管理 API を使用してサーバー構成を変更する方法、およびサーバー オブジェクトを管理する方法について説明します。

IIS 7.0 には Web サーバーの新しい管理 API である Microsoft.Web.Administration が含まれており、これを使用することによって、XML 構成ファイルを完全に操作して構成を編集できます。また、この API は、サーバー、およびそのプロパティと状態を管理するための便利なオブジェクトも提供します。この API の構成編集の面においては、プログラムによるアクセスによって、IIS 7.0 の構成ファイル階層および特定の構成ファイルにある構成プロパティの読み取りと書き込みを行うことができます。オブジェクト管理の面では、サーバーを直接管理するための一連の上位レベルの管理オブジェクトを提供します (サイト、アプリケーション プール、ワーカー プロセスなど)。

管理クラスは Microsoft.Web.Administration 名前空間に配置されています。これらのクラスは、構成セクションにアクセスするための弱い型指定のインターフェイスと、構成の属性 (仮想ディレクトリのパスなど) またはオブジェクトに対して実行する操作 (アプリケーション プールのリサイクルなど) を表すプロパティとメソッドを備えた便利なオブジェクトを提供します。

新しいサイトの作成

次のコードでは、ルート アプリケーションとルート仮想ディレクトリを備えた "Racing Cars Site" というサイトが作成されます。また、ポート 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();

サイト オブジェクトを使用して、サイトのプロパティやアプリケーションにアクセスできます。また、サイト オブジェクトには、システムにサイトを追加するメソッドやサイトの合計カウントを取得するメソッドが含まれています。Add メソッドでは、サイトの名前、ルート仮想ディレクトリ パス、およびポート番号の数値を定義します。また、Add の呼び出しでは、Site オブジェクト (以下の例では mySite) がインスタンス化されます。このオブジェクトを使用することにより、プロパティを直接変更して新しく作成されたサイトを操作できます。

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

これらの操作用のオブジェクトを使用すると、プロパティを簡単に変更できます。mySite オブジェクトからプロパティにアクセスすることで、特定の XML 属性や要素の概念を知らなくても、サイトの自動開始プロパティを直接 "true" に設定できます。

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();
        }
    }
} 

インデックスを指定してサイトを取得する代わりに、サイト オブジェクトをインスタンス化し、そのオブジェクトへの参照を設定できます。参照を設定したら、そのサイト オブジェクトのメソッド (この場合は Name) を呼び出して、サイトの名前を直接変更できます。

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";

サーバー マネージャーのサイト オブジェクトと同様に、サーバー マネージャーのアプリケーション プール オブジェクトでは、アプリケーション プール オブジェクトを作成し、そのオブジェクトへの参照を設定できます。また、プロパティの取得や設定、およびメソッドの呼び出しを行うこともできます。

更新呼び出しによってアプリケーション プールの構成データがファイルにシリアル化されたら、Recycle メソッドを実行できます。アプリケーション プールは単純に作成され、リサイクルの必要はないため、このリサイクル呼び出しは必須ではありません。ただしここでは、作成されたオブジェクトがディスクにシリアル化されてからそのオブジェクトに対して操作を実行できること、およびサーバーがこの構成を取得してそれに応じて動作することを示すために、これを例示しています。

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 に対する構成設定

次のコードでは、"Default Web Site" サイトについて、セクションの "enabled" 属性を true に設定します。

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 呼び出しは、具体的には、特定のサイト (Default Web Site など)、および特定のパス (ルートなど) の web.config ファイルを取得します。

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

web.config ファイルが取得されると (存在しない場合は作成されます)、セクションを取得するための呼び出しが行われます。ここでは、セクションを無効にするために、これを取得します。web.config ファイルが存在しない場合 (または、存在してもセクションが明示的に設定されていない場合) であっても、サイト レベルで適用される有効な構成は存在します。これは上書きされる構成です。

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

セクション オブジェクトのメソッドを使用することで、enabled 属性を取得し、Value メソッドでその値を設定できます。サーバー マネージャーの変更コミットのメソッドを呼び出すことによってはじめて、変更がディスクにシリアル化されて永続化され、サーバーによってすぐに取得されます。構成オブジェクトのインスタンスが複数ある場合は、サーバー マネージャーで変更コミットを呼び出すと、すべてのオブジェクトがディスクに永続化されます。

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

また、インデクサーを使用して、セクションの属性情報を取得および設定することもできます。セクション オブジェクトを取得した後、次のコード行を使用して enabled 属性値を設定できます。

section["enabled"] = true;

この結果、指定されたサイトの web.config ファイルに構成が設定されます。

applicationHost.config に対するサイトの構成設定

次のコードでは、"Default Web Site" サイトについて、セクションの "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 ファイルを取得している点です。

注 : セクション取得呼び出しには、読み取りや変更が行われるセクションとその場所のパスの両方を指定します。

Configuration config = serverManager.GetApplicationHostConfiguration();

この結果、location タグで指定されたサイトの適切な applicationHost.config ファイルに構成が設定されます。