Microsoft.Web.Administration を使用する方法

作成者: Saad Ladki

はじめに

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

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

管理クラスは 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 メソッドでは、サイトの名前、ルート仮想ディレクトリ パス、整数としてのポート番号も定義されます。 また、この呼び出しは 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();
        }
    }
}

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

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

インデクサーを再び使用して、ルート アプリケーションとルート ディレクトリを取得し、それに対する物理パスを設定します。

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

サイト オブジェクトに加えて、構成プロパティを取得して設定したり、state メソッドやデータを操作したりするための便利な方法を提供するアプリケーション プール オブジェクトがあります。 新しいアプリケーション プールが作成され、その後すぐ、サイトがそのアプリケーション プールに配置されます。

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 で構成を設定する

次のコードでは、サイト "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 =
            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");

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

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

セクションから属性情報を取得および設定するもう 1 つのオプションは、インデクサーを使用することです。 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 ファイルを取得するための構成マネージャー呼び出しです。

Note

get セクション呼び出しは、読み取りまたは変更されるセクションと、その場所のパスの両方を指定する呼び出しです。

Configuration config = serverManager.GetApplicationHostConfiguration();

最終的な結果は、場所タグを使用して指定されたサイトに適用できる applicationHost.config ファイルの構成セットです。