サービス ビヘイビアー構成の場所を検出する Windows PowerShell スクリプト

WCF 4.0 では、構成階層内にある複数の構成ファイルのサービス ビヘイビアーを結合する機能が追加されています。この機能により、高レベルの構成ファイル (サイトレベルの web.config など) で共通のビヘイビアーを定義し、低いレベルの構成ファイルで追加のビヘイビアーを定義することが容易になります。このしくみについて、次の例で説明します。

サイトレベルの web.config

  <configuration>
    <system.serviceModel>
      <behaviors>
        <serviceBehaviors>
          <behavior name="MyBehavior">
            <serviceDebug includeExceptionDetailInFaults="True" />
            <serviceMetadata httpGetEnabled="True" />
          </behavior>
        </serviceBehaviors>
      </behaviors>
    </system.serviceModel>
  </configuration>

アプリケーションレベルの web.config

  <configuration>
    <system.serviceModel>
      <behaviors>
        <serviceBehaviors>
          <behavior name="MyBehavior">
            <etwTracking profileName="Troubleshooting Tracking Profile" />
          </behavior>
        </serviceBehaviors>
      </behaviors>
    </system.serviceModel>
  </configuration>

アプリケーション内部にあり、"MyBehavior" を使用するように構成されている WCF サービスは、実質的に serviceDebug/serviceMetadataetwTracking の両方の構成を継承することになります。結合されたビヘイビアー構成の詳細については、「WCF 4.0 構成でのビヘイビアーの結合」 (https://go.microsoft.com/fwlink/?LinkId=194422) および「.NET 構成結合の既定の動作」 (https://go.microsoft.com/fwlink/?LinkId=194423) を参照してください。

ビヘイビアー構成の結合により柔軟性が高まる一方で、サービスの有効なビヘイビアー構成がローカルの web.config で定義される構成とは異なる場合があるため、混乱が生まれることもあります。このサンプルでは、サービス ビヘイビアーの構成を分析し、有効な設定を含む構成ファイルの場所を報告する PowerShell スクリプトを、コマンドレット フォームで作成する方法を説明します。

ヒント

サンプルは学習用としてのみ提供されています。運用環境での使用を目的としておらず、運用環境でのテストも行われていません。サンプルについてマイクロソフトのテクニカル サポートは提供されません。

前提条件

ユーザーは Windows PowerShell スクリプトおよび AppFabric コマンドレットについて理解している必要があります。

サンプルでは次のことを前提としています。

  • PowerShell v2 がインストールされていること。

  • 既定の AppFabric インストールが実行されていること。

サンプルの場所とファイル

サンプル ファイルには以下のものが含まれています。

  • Readme.mhtml

  • Code\detectServiceBehaviorConfigLocation.ps1

このサンプルの設定と実行

  1. 次の例では、PowerShell コンソールからスクリプト コマンドレットを実行する方法を示します。

    PS> cd <samples>\Samples\Management\DetectServiceBehaviorConfigLocation\Code
    
    PS> . .\detectServiceBehaviorConfigLocation.ps1 #the first dot is for loading the ps1 as a function library
    
    PS> Get-ServiceBehaviorConfigLocation -SiteName "Default Web Site" -VirtualPath /App/service.svc
    
    Name                                                        Location
    ----                                                        --------
    etwTracking                                                 MACHINE/WEBROOT/APPHOST/Default Web Site
    serviceDebug                                                MACHINE/WEBROOT/APPHOST/Default Web Site/App
    serviceMetadata                                             MACHINE/WEBROOT/APPHOST/Default Web Site/App
    

    ヒント

    サンプルを動作させるために、実行ポリシーを ‘Restricted’ から ‘RemoteSigned’ に変更しなければならない場合があります。

    ヒント

    Get-ServiceBehaviorConfigLocation コマンドレットは、ターゲット サービスの SiteName と VirtualPath を指定する 2 つのパラメーターを取り、IIS パス形式の構成ファイルの場所が含まれる有効なビヘイビアー構成設定の一覧を返します。

  2. このコマンドレットは、AppFabric の Get-ASAppService コマンドレットからの出力をパイプライン経由で受け取ることもできます。これにより、次の例に示すように、指定されたスコープで検出されたすべてのサービスに対してコマンドレットを実行することができます。

    PS> Get-ASAppService -SiteName "Default Web Site" | 
          foreach-object {$service=$_; Get-ServiceBehaviorConfigLocation $service | 
          select-object @{Name="SiteName"; Expression={$service.SiteName}}, @{Name="VirtualPath"; Expression={$service.VirtualPath}}, "Name", "Location"}
    
    SiteName                      VirtualPath                   Name                          Location
    --------                      -----------                   ----                          --------
    Default Web Site              /App/service.svc            serviceDebug                  MACHINE/WEBROOT/APPHOST/De...
    Default Web Site              /App/service.svc            serviceMetadata               MACHINE/WEBROOT/APPHOST/De...
    Default Web Site              /AnotherApp/HelpRequestT... etwTracking                   MACHINE/WEBROOT
    Default Web Site              /AnotherApp/HelpRequestT... workflowInstanceManagement    MACHINE/WEBROOT
    ...
    

    Get-ASAppService で見つかったサービスの一覧が Get-ServiceBehaviorConfigLocation にパイプされ、foreach 句を使用して最終出力の書式が設定されます。サービスとそのビヘイビアー設定の対応関係がわかるように、各サービスの SiteNameVirtualPath が元の結果に追加されています。

このサンプルの削除

  1. このサンプルを実行してもコンピューター上のリソースは変更されないため、PowerShell セッションを閉じるだけです。

デモ

このサンプルのスクリプトは次の 4 つのセクションで構成されます。

初期化

スクリプトの最初の部分では、すべての依存関係がロードされます。これには、AppFabric コマンドレット モジュールのロードや IIS 構成の読み取りに使用する Microsoft.Web.Administration ライブラリのロードが含まれます。

if ((Get-Command -Module ApplicationServer) -eq $null)
{
    Import-Module ApplicationServer
}

[System.Reflection.Assembly]::LoadFrom( "C:\windows\system32\inetsrv\Microsoft.Web.Administration.dll" ) | Out-Null

コマンドレット関数

このサンプルのもう 1 つの目的は、コマンドレットをコードではなくスクリプトで作成する方法を示すことです。Get-ServiceBehaviorConfigLocation は、コマンドレットを定義する関数です。PowerShell スクリプトの通常の関数とは異なり、Param (コマンドレットのパラメーター セットの定義)、Process (レコード処理のためのロジック)、および End (クリーンアップのロジック) が含まれます。

ここでは、このコマンドレット関数は入力パラメータの正規化のみを実行し、GetBehaviorConfigLocationPerService 関数を呼び出します。ビヘイビアー構成設定の場所を検出するためのメイン ロジックは、この関数に含まれています。

メイン関数

メイン関数である GetBehaviorConfigLocationPerService は、まずサービスのスコープにある構成ファイルを開きます。サンプルでは、Microsoft.Web.Administration.dll 内のマネージ コード API を使用して IIS 構成階層内の構成ファイルが読み取られます。一致するサービス構成を持つ <behavior> 要素がすべて検出され、それぞれの子要素すべてが列挙されます。

列挙の実行中は、有効なビヘイビアー設定の一覧を格納するハッシュ テーブル ($effectiveChildElementMap) が保持されます。列挙が構成階層の下位に進むにつれてハッシュ テーブルの内容は変化します。たとえば、<remove name="X"/> 要素が検出されると、設定 X は削除されます。列挙が完了すると、ハッシュ テーブル内の最終的な値が、サービスの有効なビヘイビアー構成に対応付けられます。

ヘルパー関数

  • FindBehaviorElementsByName - 指定した名前と一致する "name" 属性を持つすべての <behavior> 要素を検索します。

  • IsClearTagPresent - 指定した <behavior> 要素の下に <clear> 要素があるかどうかを判断します。

  • IsRemoveTagPresent - 指定した <behavior> 要素の下に、一致する "name" 属性を持つ <remove> 要素があるかどうかを判断します。

Known Issues/Limitations

  • 同じ親 <behavior> 要素の下の、<remove>/<clear> 要素とそれ以外の要素の出現順は、Microsoft.Web.Administration API では判断できません。サンプルでは、<remove> および <clear> 要素が先に存在すると想定しています。

  2012-03-05