設定の拡張性

IIS 7.0 以降の構成システムは、IIS、ASP.NET、およびその他のコンポーネントの構成を含む分散 xml ファイルに基づいています。構成システムの柔軟性により、サーバー、サイト、アプリケーション レベルなど、さまざまなレベルで構成を設定することもできます。 サイト レベルとアプリケーション レベルでの構成は、web.config ファイル内 ASP.NET 構成と共存します。

新しい構成システムの 1 つの側面は、構成を拡張できる簡単さです。 いくつかの簡単な変更だけで、カスタム構成セクションを構成システムに直接統合し、既存の管理 API を使用してこれらの設定を操作することができます。 構成は、XML スキーマ ファイルに新しい構成セクションを定義するだけで拡張され、IIS スキーマ ディレクトリ %windir%\system32\inetsrv\config\schemaにドロップされます。 最後に、新しい構成セクションを IIS グローバル構成ファイルに登録する必要があります。

この記事では、基本的な構成の拡張性と、より高度なシナリオの一部を使用する例について説明します。 使用される例は工夫されていますが、構成の拡張性の能力を示すには十分です。

前提条件

この記事には、いくつかの前提条件があります。 これには次のようなものがあります。

  1. IIS 7.0 以降の既定のインストールがある。 IIS がインストールされていない場合は、サーバー マネージャーを開き、Web サーバー (IIS) ロールを追加してインストールします。
  2. .NET Framework SDK がインストールされていることを確認します。 SDK がインストールされていない場合は、https://www.microsoft.com/downloadsから入手してください。
  3. SDK の bin ディレクトリで多数のツールを使用する。 スタート メニューから SDK コマンド プロンプトを使用するか、bin ディレクトリをパスに追加します (例: %systemdrive%\Program Files\Microsoft.NET\SDK\v2.0\Bin)
  4. 管理者特権でコマンド プロンプトからすべてのコマンドを実行する。 スタート メニューの [SDK コマンド プロンプト] (または [コマンド プロンプト]) を右クリックし、[管理者として実行] を選択します。

構成の拡張性 - 基本

概要

基本的な構成拡張機能の一部を示すために、カスタム ログ モジュールの例を使用します。 モジュール自体は特別なものであり、単に組み込みの IIS ログ イベント (LogRequest ) を処理し、ログ エントリをディスク上のファイルに書き込みます。IIS ログの基本バージョンと考えてください。

モジュールは情報をログに記録する場所を知る必要があるため、構成の拡張機能が機能します。 モジュールには、その構成 (この場合はログ ファイルの場所) を格納するカスタム構成セクションが必要です。

手順 1 - スキーマ ファイル

新しい構成セクションを追加する最初の手順は、セクションを定義することです。 xml でセクション スキーマを定義し、ファイルを %windir%\system32\inetsrv\config\schema ディレクトリにドロップします。

simpleLogging_Schema.xml という名前の xml ファイルを作成し、次の内容を入力します。

<configSchema> 
    <sectionSchema name="system.webServer/simpleLogging"> 
        <attribute name="logfileDirectory" type="string" 
            defaultValue="%systemdrive%\inetpub\logs\simpleLogs" expanded="true" encrypted="false" />

    </sectionSchema> 
</configSchema>

上記のスキーマでは、2 つの処理が行われます。 まず、 <sectionSchema> 要素を使用して、"simpleLogging" という名前の新しい構成セクションを定義します。 次に、"logfileDirectory" という新しい構成セクションの属性を定義します。

スキーマ ファイルから、属性が文字列であり、構成システムによって暗号化されないことが確認できます。 expanded="true" は、使用されたときに環境変数を自動的に展開するように構成システムに指示します。 %windir%\system32\inetsrv\config\schema ディレクトリにファイルを作成しなかった場合は、ここで移動します。

次に、"logfileDirectory" に指定された既定のディレクトリを作成します。これは、コンピューターに存在しない可能性があるためです。 コマンド ラインから次のコマンドを実行して、ディレクトリを作成します。

md %systemdrive%\inetpub\logs\simpleLogs

手順 4 で作成した SimpleLogging モジュールがログ ファイルを書き込むことができるように、Windows グループ IIS_IUSRSにはディレクトリへの書き込みアクセス許可が必要です。 コマンド ラインで次のコマンドを実行します。

icacls %systemdrive%\inetpub\logs\simpleLogs /grant BUILTIN\IIS_IUSRS:RW

スキーマの詳細

この例では手順 1 は完了していますが、スキーマ ファイルについて説明するのが適切です。 上記のスキーマでは、system.webServer の下に存在し、カスタム属性を指定した新しい構成セクション simpleLogging を作成しました。 ただし、コレクション、要素、属性を使用して、より複雑なカスタム構成を簡単に作成できます。 次の一覧にいくつかの例を示しますが、最も良い方法は、IIS 構成のスキーマ ファイルを確認することです。 %windir%\system32\inetsrv\config\schema\IIS\_schema.xmlで見つけます。

  • 属性

    スキーマ情報:

    <attribute 
    name="" [String, Required] [XML name of the attribute] 
    type="" [bool|enum|flags|uint|int|int64|string|timeSpan, Required] [Runtime type] 
    required="false" [bool] [Indicates if it must be set] 
    isUniqueKey="false" [bool] [Serves as the collection key] 
    isCombinedKey="false" [bool] [Part of a multi-attribute key] 
    defaultValue="" [String] [Default value or comma-delimited flags] 
    encrypted="false" [bool] [Indicates if the value persisted is encrypted] 
    expanded="false" [bool] [Environment variables are expanded when read] 
    allowInfinite="false" [bool] [Indicates if "Infinite" can be set] 
    timeSpanFormat="string" [string|seconds|minutes] [hh:mm:ss or number] 
    validationType="" [See validation below] 
    validationParameter="" [See validation below] 
    />
    

    Example:

    <configSchema> 
      <sectionSchema name="system.webServer/simpleLogging"> 
        <attribute name="logfileDirectory" type="string" />
      </sectionSchema> 
    </configSchema>
    
  • 要素

    スキーマ情報:

    <element 
     name="" [String, Required] [XML name of the element]
     isCollectionDefault="false" [bool] [Indicates if default values are held for other elements in this collection] />
    

    Example:

    <configSchema> 
      <sectionSchema name="system.webServer/simpleLogging"> 
        <element name="logfile"> 
          <attribute name="fileLocation" type="string" /> 
        </element> 
      </sectionSchema> 
    </configSchema>
    
  • コレクション

    スキーマ情報:

    <collection 
    addElement="" [String] [Name of Add directive, if supported] 
    removeElement="" [String] [Name of Remove directive, if supported] 
    clearElement="" [String] [Name of Clear directive, if supported] 
    defaultElement="" [applicationDefaults|applicationPoolDefaults|siteDefaults|virtualDirectoryDefaults] 
    mergeAppend="true" [bool] [Indicates whether or not deepest set values are appended] 
    allowDuplicates="false" [bool] [Indicates if multiple elements may have the same key] 
    allowUnrecognizedAttributes="false" [bool] [Indicates if non-schema attributes are ok] 
    />
    

    Example:

    <configSchema> 
      <sectionSchema name="system.webServer/simpleLogging"> 
        <collection addElement="add"> 
          <attribute name="logfileDirectory" type="string" /> 
        </collection> 
      </sectionSchema> 
    </configSchema>
    

手順 2 – 新しいセクションの登録

新しいセクションが定義されたので、そのセクションについて構成システムに通知します。 %windir%\system32\inetsrv\config\applicationHost.config ファイルに新しいセクションを登録します。 ファイルを開き、次のように simpleLogging セクションを登録します。

<configSections> 
    ...
    <sectionGroup name="system.webServer"> 
        <section name="simpleLogging"/> 
        ...
    </sectionGroup> 
</configSections>

この手順は完了です。 セクションが定義され、登録されます。

セクションが正しく登録されていることを確認するには、コマンド ラインから次のコマンドを実行します。

%windir%\system32\inetsrv\appcmd list config –section:system.webServer/simpleLogging

すべてが今までうまくいっている場合は、構成セクションが表示され、次のようなものが表示されます。

<system.webServer> 
    <simpleLogging /> 
</system.webServer>

手順 3 - 構成の設定

セクションが登録されたので、web.configファイルを使用して他の構成と同様に構成を設定するか、 ディレクトリの %windir%\system32\inetsrv\ ツールを使用して設定します。 構成 API を使用して構成を設定することもできます。 もう 1 つのオプションは、UI モジュールを作成し、構成 API を呼び出して構成を設定することで、新しい IIS 管理 UI を使用して構成を設定することです。

当面は、既定の IIS Web サイトの新しい web.config ファイル ( %systemdrive%\inetpub\wwwroot\ にインストールされ、既定の IIS 構成で "既定の Web サイト" という名前) に追加して構成を設定します。 web.config という名前のファイルを作成し、次を追加します。

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    <system.webServer> 
        <simpleLogging logfileDirectory="%systemdrive%\inetpub\logs\simpleLogs" /> 
    </system.webServer> 
</configuration>

次を使用して、コマンド ラインから同じことを実現できます。

%windir%\system32\inetsrv\appcmd set config "Default Web Site" –section:system.webServer/simpleLogging 
                                    /logfileDirectory:""%"systemdrive"%"\inetpub\logs\simpleLogs"

次のコマンドを実行して、"既定の Web サイト" の構成を一覧表示します。

%windir%\system32\inetsrv\appcmd list config "Default Web Site" –section:system.webServer/simpleLogging

出力は次のようになります。

<system.webServer> 
    <simpleLogging logfileDirectory="%systemdrive%\inetpub\logs\simpleLogs" /> 
</system.webServer>

"logfileDirectory" に指定されたディレクトリが存在しない場合は、ここで作成します。 次の手順で作成する SimpleLogging モジュールがログ ファイルを書き込むことができるように、Windows グループ IIS_IUSRSにはディレクトリへの書き込みアクセス許可が必要です。 上記の手順 1 では、既定のディレクトリに対して正しいアクセス許可を設定するために使用されるコマンド ライン コマンドが示されています。 別のディレクトリを作成した場合は、同様のコマンドを使用します。

手順 4 – SimpleLogging モジュール

この段階では、お客様の simpleLogging 構成セクションを使用して構成システムを拡張しました。 モジュールを作成し、そこからカスタム構成を使用する方法を示すことで、基本的な構成の拡張性を見てみましょう。

IIS 内のすべての Web サイトで使用できる厳密な名前の .NET アセンブリを作成します。 このセクションでは、.NET SDK のいくつかのツールを使用する必要があります。インストールされていない場合は、www.microsoft.com/downloads Web サイトからダウンロードしてください。

必要な手順は次のとおりです。

  1. 作業するディレクトリを作成して開きます。

  2. SimpleLoggingModule.cs ファイルを作成し、テキスト エディターを使用して次のコードを追加します。

    using System;
    using System.Web;
    using System.Web.Hosting;
    using System.IO;
    using Microsoft.Web.Administration;
    
    namespace ConfigurationExtensibility
    {
        public class SimpleLoggingModule : IHttpModule
        {
            private string GetlogfileDirectory(HttpContext context)
            {
                ConfigurationSection section = WebConfigurationManager.GetSection(
                        context, "system.webServer/simpleLogging");
                return (string)section["logfileDirectory"];
            }
     
            public void Init(HttpApplication context)
            {
                context.LogRequest += new EventHandler(LogRequest_EventHandler);
            }
     
            private void LogRequest_EventHandler(object sender, EventArgs e)
            {
                HttpApplication application = (HttpApplication)sender;
                LogRequest(application.Context);
            }
     
            private void LogRequest(HttpContext context)
            {
                string logfileDirectory = GetlogfileDirectory(context);
     
                if (Directory.Exists(logfileDirectory) == false)
                {
                    Directory.CreateDirectory(logfileDirectory);
                }
     
                string logfile = Path.Combine(logfileDirectory, DateTime.Now.ToString("yyyyMMdd") + ".log");
                string ogline = string.Format("{0}\t{1}\t{2}\t{3}\t{4}\t{5}\t{6}\t{7}",
                        DateTime.Now,
                        context.Request.HttpMethod,
                        context.Request.UserHostAddress,
                        context.Request.Url.ToString(),
                        context.Request.ServerVariables["LOGON_USER"],
                        context.Request.UserAgent,
                        context.Response.StatusCode,
                        HostingEnvironment.SiteName);
            File.AppendAllText(logfile, ogline + Environment.NewLine);
            }
     
            public void Dispose()
            {
            }    
        }
    }
    
  3. IIS がすべてのサイトのグローバル モジュールとして使用するには、これを厳密に名前付きモジュールにする必要があります。 まず、厳密な名前のキー ファイルを作成します。 コマンド プロンプトを開き、ディレクトリを SimpleLoggingModule.cs ファイルを含むディレクトリに変更します。 次に、次のコマンドを実行します (.NET Framework SDK の bin ディレクトリがパスにあることを確認してください)。

    sn.exe /k keyFile.snk
    

    これが正しく機能した場合、sn.exe の出力には"keyFile.snk に書き込まれたキー ペア" のようなものが示されます

  4. 次に、ファイルをコンパイルし、DLL を作成します。 コマンド プロンプトから次のコマンドを実行します。

    %windir%\Microsoft.NET\Framework\v2.0.50727\csc.exe /t:library SimpleLoggingModule.cs /r:System.Web.dll 
                       /r:%windir%\system32\inetsrv\Microsoft.Web.Administration.dll /keyfile:keyFile.snk
    
  5. 次に、コンパイル済みアセンブリ (SimpleLoggingModule.dll) をグローバル アセンブリ キャッシュに配置します。 コマンド プロンプトから次のコマンドを実行します。

    gacutil.exe /i SimpleLoggingModule.dll
    
  6. 次に、IIS で使用できるモジュールの一覧にモジュールを追加する必要があります。 ただし、その前に、先ほど作成したアセンブリの完全な名前を取得する必要があります。 コマンド ラインで次を実行します。

    gacutil.exe /l SimpleLoggingModule
    

    これにより、次のような出力が出力されます。

    SimpleLoggingModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=652a8d02f48e4288, processorArchitecture=MSIL
    
  7. IIS で使用できるモジュールの一覧にモジュールを追加します。 次のコマンドを実行します。 ただし、変数は必ず最後のコマンドの出力に置き換えてください。

    %windir%\system32\inetsrv\appcmd add module /name:"SimpleLoggingModule" 
    /type:"ConfigurationExtensibility.SimpleLoggingModule, SimpleLoggingModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=652a8d02f48e4288"
    

    これにより、必要な構成エントリが applicationHost.config ファイル (IIS のグローバル構成ファイル) に追加されます。

  8. プロセスが完了しました。 カスタム構成を使用するカスタム モジュールがセットアップされました。 残っているのは、それをテストするということです。 ブラウザーを開始し、http://localhost/. に移動する 次の内容が表示されます。

    Web ブラウザーでローカル ホストにアクセスするスクリーンショット。

エラーが発生した場合は、ディレクトリに書き込むIIS_IUSRS グループのアクセス許可が付与されていることを確認します。

%systemdrive%\inetpub\logs\simpleLogs (または構成で使用したディレクトリ) を開くと、今日の日付で名前が付けられた.log ファイルが作成されます。 ファイルを開くと、次のような内容が表示されます。

ローカル ホスト Web サイトのアクセスされたディレクトリのタイムスタンプを含むログ ファイルのスクリーンショット。

構成を試して、動作していることを確認します。 web.config ファイルから simpleLogging セクションを削除して、ログが既定の場所に移動するかどうかを確認します (ASPNET ユーザーが正しいアクセス許可を持っていることを確認してください)。

先ほど作成したモジュールはデモンストレーションのみを目的としており、運用環境では使用しないでください。 ログ エントリを同時に書き込もうとする要求が複数ある場合は失敗します。

構成の拡張性 - より高度なシナリオ

概要

前のセクションでは、スキーマを使用して構成を拡張するだけで、構成の拡張性の基本について説明しました。 ただし、構成を拡張するときに使用できる電力が増えます。

最初に、構成を取得するために COM オブジェクトを使用するように構成を拡張する機能があり、構成 API が構成情報を読み取ることができないことを気にせずに、必要な場所に構成情報を格納できます。

2 つ目は、設定を操作および運用するメソッドを定義する機能です。 これらのメソッドは、既存の構成 API を使用して呼び出すことができます。 これら 2 つの機能を組み合わせることで、カスタム構成拡張機能を構築するための強力なサポートが提供されます。

このセクションでは、最初に、COM コンポーネントを使用して構成値を取得するために、この記事の最初の部分から単純なLogging カスタム構成を変更する方法について説明します。 次に、アクションを実行する COM コンポーネントによってサポートされる構成方法の追加について説明します。

構成の拡張 - COM によってサポートされる属性

このセクションでは、"logfileCount" という属性を持つスキーマを拡張します。 この構成属性は、ログ ディレクトリ内のログ ファイルの数をカウントする .NET アセンブリ (マネージド dll - C# でプログラミング) によってサポートされます。もう一度、これは工夫されたシナリオですが、役に立つと思われるシナリオもあります。

.NET コンポーネントを作成する必要はありません。有効な COM コンポーネントがあれば作成できます。

手順 1 - .NET COM コンポーネントの作成と登録

まず、.NET COM コンポーネントを作成します。 作成するファイルとビルドして開くコンポーネントを格納するディレクトリを作成します。

作成するコンポーネントは、IIS 構成システムによって COM 経由で公開されるいくつかのインターフェイスを実装する必要があります。 .NET コンポーネントから COM インターフェイスを使用するには、相互運用 dll を作成する必要があります。これにより、IIS 構成システムは logfileCount 属性の値を取得する必要があるときにコンポーネントと通信できます。 相互運用 dll を作成するには、.NET Framework SDK から tlbimp.exeというツールを使用します。 この記事では、Visual Studio または .NET SDK をインストールすることが前提条件です。 インストールされていない場合は、www.microsoft.com/downloads. からダウンロードします

.NET COM コンポーネントを作成する手順を次に示します。

  1. コマンド ライン プロンプトを開き、ファイルを格納するために作成したディレクトリに移動します。 .NET Framework の bin ディレクトリがパスにあることを確認し、コマンド ラインで次のコマンドを実行します。

    tlbimp %windir%\system32\inetsrv\nativerd.dll /keyfile:keyFile.snk
    

    tlbimp.exe ツールは、AppHostAdminLibrary.dll という名前のファイルを作成します。これは、必要な相互運用 dll です。

  2. 前に作成したディレクトリにConfigurationExtensibility.cs ファイルを作成し、テキスト エディターを使用して次の C# コードをファイルにコピーします。

    using System;
    using System.IO;
    using System.Runtime.InteropServices;
    using AppHostAdminLibrary;
    
    namespace ConfigurationExtensibility
    {
        [ComVisible(true)]
        public class SimpleLoggingExtension : IAppHostPropertyExtension
        {
            public void ProvideGetProperty(IAppHostElement pElement, IAppHostProperty pProperty)
            {
                switch(pProperty.Name)
                {
                case "logfileCount":
                string logDirectory = (string) pElement.Properties["logfileDirectory"].Value;
     
                if(Directory.Exists(logDirectory))
                pProperty.Value = Directory.GetFiles(logDirectory, "????????.log").Length;
                else 
               pProperty.Value = 0;
                break;
            }
            }
        }
    }
    

    IAppHostPropertyExtension インターフェイスを実装するクラスがあります。 コード自体は、logfileDirectory 属性のみを読み取ってログ ファイル ディレクトリを取得し、SimpleLoggingModule によって作成されたログ ファイルのファイル名パターンに一致するすべてのファイルをカウントします。

  3. コマンド ラインから次のコマンドを実行して、コンポーネントをビルドします。

    %windir%\Microsoft.NET\Framework\v2.0.50727\csc.exe /t:library /r:AppHostAdminLibrary.dll 
                        ConfigurationExtensibility.cs /keyfile:keyFile.snk
    

    これで、.NET COM コンポーネント (ConfigurationExtensibility.dll) が作成 されました

  4. 先ほど作成したマネージド COM コンポーネントを登録します。 コマンド プロンプトで次のコマンドを実行します。

    %windir%\Microsoft.NET\Framework\v2.0.50727\regasm.exe /register /codebase ConfigurationExtensibility.dll
    

    これにより、COM コンポーネントがレジストリに登録されます。 構成システムで使用できる .NET COM コンポーネントを作成して登録しました。

手順 2 - スキーマ ファイルの更新

次に、先ほど作成した simpleLogging_Schema.xml ファイルを変更します。 ファイルを開き、次のように変更します (新しい属性は太字で表示されます)。

<configSchema> 
    <sectionSchema name="system.webServer/simpleLogging"> 
        <attribute name="logfileDirectory" type="string" 
             defaultValue="%systemdrive%\inetpub\logs\simpleLogs\" expanded="true" encrypted="false" />
        <attribute name="logfileCount" type="int" extension="ConfigurationExtensibility.SimpleLoggingExtension" /> 
    </sectionSchema> 
</configSchema>

手順 3 - テスト

すべてが正常に動作しているはずです。残っているのはテストです。 拡張機能をテストするには、単純なスクリプトを使用します。 SimpleLoggingTest.vbs ファイルを作成し、次のテキストを入力します。

Dim adminManager, section
Set adminManager = WScript.Createobject("Microsoft.ApplicationHost.AdminManager")
Set section = adminManager.GetAdminSection("system.webServer/simpleLogging",
                    "MACHINE/WEBROOT/APPHOST/Default Web Site")
WScript.Echo(section.Properties.Item("logfileCount").Value)

この段階では、前に SimpleLoggingModule をテストしたログ ファイルが 1 つ必要です。 コマンド ラインからスクリプトを実行します。 出力は 1 です。

構成の拡張 - COM によってサポートされるメソッド

最後に、この記事では、メソッドを使用した構成の拡張について説明します。 構成メソッドは、構成の変更やログ ファイルの削除など、構成システムが実行するために呼び出すことができる操作です。これは、このメソッドが実行する操作です。 この例では、SimpleLoggingModule によって作成されたすべてのログ ファイルを削除するメソッドを追加します。

手順 1 - コード

  1. まず、メソッドに必要なコードを追加します。 前に作成したConfigurationExtensibility.cs ファイルを開き、次のように更新します (太字の新しいコード)。

    using System;
    using System.IO;
    using System.Runtime.InteropServices;
    using AppHostAdminLibrary;
     
    namespace ConfigurationExtensibility
    {
        [ComVisible(true)]
        public class SimpleLoggingExtension : IAppHostPropertyExtension, IAppHostMethodExtension 
        {
            public void ProvideGetProperty(IappHostElement pElement, IappHostProperty pProperty)
            {
                switch(pProperty.Name)
                {
                case "logfileCount":
                string logDirectory = (string) pElement.Properties["logfileDirectory"].Value;
     
                if(Directory.Exists(logDirectory))
                pProperty.Value = Directory.GetFiles(logDirectory, "????????.log").Length;
                else 
               pProperty.Value = 0;
                break;
            }
            }
     
            public void ProvideMethod(IappHostMethod pMethod,
                IappHostMethodInstance pMethodInstance,
                IappHostElement pElement)
            {
                switch(pMethod.Name)
            {
                case "deleteLogs":
                string logDirectory = (string) pElement.Properties["logfileDirectory"].Value;
     
                if(Directory.Exists(logDirectory))
                {
                foreach(string logFile in Directory.GetFiles(logDirectory, "????????.log"))
                {
                    File.Delete(logFile);
                    }
                }
     
                break;
            }
            }
        }
    }
    

    IAppHostMethodExtension インターフェイスを実装しました。 このインターフェイスには、メソッドを論理的に 提供する ProvideMethod という 1 つのメソッドがあります。 誰かがメソッドを呼び出すとき (手順 3. を参照してください)、構成システムは ProvideMethod を呼び出し、パラメーターを渡します。そのうちの 1 つは呼び出されるメソッドの名前を持っています。上記のコードでは、"deleteLogs" という名前のメソッドのみを処理します。

  2. 次を使用して、プロジェクトをもう一度ビルドします。

    %windir%\Microsoft.NET\Framework\v2.0.50727\csc.exe /t:library /r:AppHostAdminLibrary.dll 
                ConfigurationExtensibility.cs /keyfile:keyFile.snk
    

手順 2 - スキーマの更新

次に、新しいメソッドをスキーマに伝達します。 この段階では、 simpleLogging_Schema.xml ファイルをよく知っているので、もう一度開き、次のように変更してください。

<configSchema> 
    <sectionSchema name="system.webServer/simpleLogging"> 
        <attribute name="logfileDirectory" type="string" 
            defaultValue="c:\inetpub\logs\simpleLogs\" expanded="true" encrypted="false" />
        <attribute name="logfileCount" type="int" extension="ConfigurationExtensibility.SimpleLoggingExtension" /> 
        <method name="deleteLogs" extension="ConfigurationExtensibility.SimpleLoggingExtension" /> 
    </sectionSchema> 
</configSchema>

この変更により、"deleteLogs" という名前の新しいメソッドが定義され、メソッドを検索する場所が構成に指示されます。

手順 3 - テスト

最後に、メソッドが動作しているかどうかを確認します。 これを行う簡単で簡単な方法は、単純な VB スクリプトを記述する方法です。 logfileCount を出力し、メソッドを呼び出して logfileCount を出力するスクリプトの例を次に示します。 先ほど作成した SimpleLoggingTest.vbs ファイルを更新し、次のように入力するだけです。

Dim adminManager, section
Set adminManager = WScript.Createobject("Microsoft.ApplicationHost.AdminManager")
Set section = adminManager.GetAdminSection("system.webServer/simpleLogging", "MACHINE/WEBROOT/APPHOST/Default Web Site")
WScript.Echo(section.Properties.Item("logfileCount").Value)
section.Methods.Item("deleteLogs").CreateInstance().Execute()
WScript.Echo(section.Properties.Item("logfileCount").Value)

コマンド ラインからスクリプトを実行すると、次の出力が表示されます。

1
0

上記は、COM コンポーネントによってサポートされる新しい構成と構成方法を提供する方法の概要を簡単に示しました。 ご存知のように、この方法を使用した構成の拡張は非常に強力です。

構成の拡張 - 既存の構成の拡張

構成拡張機能の最後の側面は、 system.webServer/sites セクションなどの既存の構成セクションを拡張したり、前の 2 つのセクションで作成した system.webServer/simpleLogging セクションを拡張したりする機能です。

既存の構成セクションの拡張は、新しい構成セクションを作成するのと同じくらい簡単です。 スキーマを xml として定義し、スキーマ ファイルを %windir%\system32\inetsrv\config\schema\ ディレクトリに配置するだけです。 これは、以前に複数回行ったので、聞き覚えがあるはずです。

"サイト" 構成の拡張

既存の構成セクションを拡張する方法を示すために、 system.applicationHost/sites セクション (サイトの定義に使用される構成セクション) を拡張します。 "owner" 属性と "ownerEmail" 属性を追加して、sites セクションを拡張します。 このような属性は、1 つのボックスで複数のサイトをホストし、別のサイトを所有しているユーザーを追跡する場合に便利です。

まず、新しいスキーマ ファイルを作成します。 ディレクトリに %windir%\system32\inetsrv\config\schema\ ファイルを作成し、次のテキストを入力します。

<configSchema> 
    <sectionSchema name="system.applicationHost/sites"> 
        <collection addElement="site"> 
            <attribute name="owner" type="string" /> 
            <attribute name="ownerEmail" type="string" /> 
        </collection> 
    </sectionSchema> 
</configSchema>

既存のセクションのスキーマを拡張する場合は、 <sectionSchema> 要素を作成し、 name 属性を既存のセクションと同じに設定するだけです。 上記のスキーマ ファイルでは、"system.applicationHost/sites" という名前の <sectionSchema> を定義しました。これは、Schema ディレクトリの IIS_Schema.xml ファイルの sectionSchema 名と同じです。

"owner" 属性と "ownerEmail" 属性の値を追加して変更をテストし、構成ファイルを確認して変更を確認します。 コマンド ラインから次のコマンドを実行するだけです。

%windir%\system32\inetsrv\appcmd set site "Default Web Site" /owner:"John Contoso" /ownerEmail:"john@contoso.com"

構成が適用されたかどうかを確認するには、次のコマンドを実行して出力を確認します。

%windir%\system32\inetsrv\appcmd list site "Default Web Site" /config

出力は次のようになります。

<system.applicationHost> 
    <sites> 
    ...
        <site name="Default Web Site" id="1" siteOwner="John Contoso" siteOwnerEmail="john@contoso.com">
        ...
        ...
        </site> 
    </sites> 
</system.applicationHost>

http://localhost/を参照すると、サーバー 500.19 エラー メッセージが表示されることがあります。 これは既知の問題であり、IIS の後のビルドで解決される予定です。 この問題を回避するには、コマンド ラインから "iisreset" を実行します。

これで、構成の拡張性を確認できます。 できれば、前の例を読んだ後に、興味深い方法で構成拡張機能を使用できます。