構成の拡張性

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

    スキーマ情報:

    <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] 
    />
    

    例:

    <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] />
    

    例:

    <configSchema> 
      <sectionSchema name="system.webServer/simpleLogging"> 
        <element name="logfile"> 
          <attribute name="fileLocation" type="string" /> 
        </element> 
      </sectionSchema> 
    </configSchema>
    
  • collection

    スキーマ情報:

    <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] 
    />
    

    例:

    <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\ ディレクトリ内の appcmd.exe ツールを使用して設定します。 構成 API を使用して構成を設定することもできます。 もう 1 つのオプションは、UI モジュールを作成し、構成 API を呼び出して構成を設定することで、新しい IIS 管理 UI を使用して構成を設定することです。

当面は、既定の IIS Web サイトの新しい web.config ファイル (%systemdrive%\inetpub\wwwroot\ にインストールされ、既定の IIS 構成で "既定の Web サイト" の名前が付けられた 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>

Note

"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 ユーザーが正しいアクセス許可を持っていることを確認してください)。

Note

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

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

概要

前のセクションでは、スキーマを使用して構成を拡張する簡単な拡張を行い、構成の拡張性の基本について説明しました。 ただし、構成を拡張するときに使用できる機能は、もっとたくさんあります。

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

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

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

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

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

Note

.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;
            }
            }
        }
    }
    

    Note

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

    Note

    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\ ディレクトリにスキーマ ファイルを配置するだけです。 これは、ここまでで複数回行ったので、聞き覚えがあるはずです。

"sites" 構成の拡張

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

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

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

Note

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

これで、構成の拡張性を確認できます。 これらの例の学習を通して得た、さまざまな方法で構成の拡張性を活用する手段を今後にお役立てください。