次の方法で共有


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

sites オブジェクトを使用すると、サイトのプロパティとアプリケーションにアクセスできます。 また、システムにサイトを追加したり、サイトの合計数を取得したりするメソッドも含まれています。 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";

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

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 での構成の設定

次のコードは、サイト "既定の Web サイト" のセクションの "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 サイト) と特定のパス (ルート) の web.config ファイルが具体的に取得されます。

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

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

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

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

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

セクションから属性情報を取得および設定するもう 1 つのオプションは、インデクサーを使用することです。 有効な属性値を設定するために、セクション オブジェクトを取得した後に次のコード行を使用できます。

section["enabled"] = true;

最終的な結果は、指定されたサイトの web.config ファイルに設定された構成になります。

applicationHost.config でサイトの構成を設定する

次のコードは、サイト "既定の Web サイト" のセクションの "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 Manager 呼び出しです。

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

Configuration config = serverManager.GetApplicationHostConfiguration();

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