Windows PowerShell-Skript zum Erkennen des Speicherorts der Dienstverhaltenskonfiguration

In WCF 4.0 wurde die Möglichkeit hinzugefügt, Dienstverhalten aus mehreren Konfigurationsdateien in der Konfigurationshierarchie zusammenzuführen. Durch dieses Feature wird es einfacher, gemeinsame Verhalten in Konfigurationsdateien auf hoher Ebene (z. B. der web.config auf Websiteebene) und zusätzliche Verhalten in untergeordneten Konfigurationsdateien zu definieren. Das folgende Beispiel veranschaulicht dieses Vorgehen:

„web.config“ auf Websiteebene

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

„web.config“ auf Anwendungsebene

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

Ein WCF-Dienst, der sich innerhalb der Anwendung befindet und für die Verwendung von „MyBehavior“ konfiguriert ist, erbt effektiv sowohl die serviceDebug/serviceMetadata- als auch die etwTracking-Konfiguration. Weitere Details (in englischer Sprache) zur Konfiguration mit zusammengeführten Verhalten finden Sie unter Behavior Merge in WCF 4.0 Configuration (https://go.microsoft.com/fwlink/?LinkId=194422) und .NET Configuration Merge Default Behavior (https://go.microsoft.com/fwlink/?LinkId=194423).

Trotz der Flexibilität kann die Konfiguration mit zusammengeführten Verhalten manchmal zu Verwirrung führen, da die effektive Verhaltenskonfiguration eines Diensts sich von dem unterscheiden kann, was in der lokalen web.config-Datei definiert ist. In diesem Beispiel wird das Erstellen eines PowerShell-Skripts in Form eines Cmdlets gezeigt, das die Konfiguration des Dienstverhaltens analysiert und die Speicherorte der Konfigurationsdateien, die die wirksamen Einstellungen enthalten, meldet.

Hinweis

Beispiele werden nur zu Anschauungszwecken bereitgestellt. Sie sind nicht für die Verwendung in einer Produktionsumgebung gedacht und wurden nicht in einer Produktionsumgebung getestet. Microsoft bietet keinen technischen Support für diese Beispiele.

Voraussetzungen

Die Benutzer sollten mit der Skripterstellung in Windows PowerShell und mit AppFabric-Cmdlets vertraut sein.

Für das Beispiel gelten die folgenden Voraussetzungen:

  • PowerShell 2.0 ist installiert.

  • Die standardmäßige AppFabric-Installation wurde durchgeführt

Beispielspeicherort und -dateien

Das Beispiel umfasst die folgenden Dateien:

  • Readme.mhtml

  • Code\detectServiceBehaviorConfigLocation.ps1

Einrichten und Ausführen dieses Beispiels

  1. Das folgende Beispiel veranschaulicht die Ausführung des Skripts aus der PowerShell-Konsole:

    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
    

    Hinweis

    Möglicherweise müssen Sie die Ausführungsrichtlinie aus „Restricted“ in „RemoteSigned“ ändern, damit das Beispiel funktioniert.

    Hinweis

    Das Get-ServiceBehaviorConfigLocationCmdlet akzeptiert zwei Parameter, mit denen der „SiteName“ und der „VirtualPath“ eines Zielgeräts angegeben und eine Liste der wirksamen Einstellungen für das Dienstverhalten, die Speicherorte der Konfigurationsdateien im IIS-Pfadformat einschließt, zurückgegeben wird.

  2. Das Cmdlet nimmt außerdem Ausgaben des AppFabric-Cmdlets Get-ASAppService über die Pipeline entgegen. Unter anderem ermöglicht dies dem Cmdlet die Zusammenarbeit mit allen in einem bestimmen Bereich erkannten Diensten, wie im nächsten Beispiel zu sehen:

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

    Eine Liste der von Get-ASAppService gefundenen Dienste wird an das Cmdlet Get-ServiceBehaviorConfigLocation umgeleitet, und die Klausel foreach wird zum Formatieren der endgültigen Ausgabe verwendet. Beachten Sie, dass dem ursprünglichen Ergebnis der SiteName und der VirtualPath für jeden Dienst hinzugefügt werden, sodass die Dienste und ihre Verhaltenseinstellungen einander zugeordnet werden können.

Entfernen dieses Beispiels

  1. Schließen Sie einfach die PowerShell-Sitzung, da die Ausführung dieses Beispiels keine Ressourcen auf dem Computer verändert.

Veranschaulichung

Das Skript zu diesem Beispiel weist vier Abschnitte auf:

Initialisierung

Im ersten Teil des Skripts wird sichergestellt, dass alle Abhängigkeiten das geladen sind. Dies schließt das Laden des AppFabric-Cmdletmoduls und das Lesen der Microsoft.Web.Administration-Bibliothek für die IIS-Konfiguration ein.

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

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

Cmdlet-Funktion

Ein weiteres Ziel dieses Beispiels liegt darin, das Erstellen von Cmdlets als Skript anstelle von Quellcode zu veranschaulichen. Get-ServiceBehaviorConfigLocation ist die Funktion, mit der das Cmdlet definiert wird. Im Gegensatz zu einer normalen Funktion in PowerShell-Skripts enthält sie die Schlüsselwörter Param, Process und End zum Definieren von Cmdlet-Parametersätzen, Logik für die Datensatzverarbeitung bzw. Logik für die Bereinigung.

Im dargestellten Fall ist diese Cmdlet-Funktion lediglich für das Normalisieren der Eingabeparameter und den Aufruf der Funktion GetBehaviorConfigLocationPerService zuständig, die ihrerseits die Hauptlogik für die Erkennung des Speicherorts der Verhaltenskonfigurationseinstellungen enthält.

Die Hauptfunktion

Die Hauptfunktion GetBehaviorConfigLocationPerService öffnet zuerst die Konfiguration für den Bereich des Diensts. Das Beispiel verwendet eine API zu verwaltetem Code in Microsoft.Web.Administration.dll, um Konfigurationsdateien in der IIS-Konfigurationshierarchie zu lesen. Im Beispiel werden alle <behavior>-Elemente mit passender Dienstkonfiguration gefunden und ihre sämtlichen untergeordneten Elemente aufgezählt.

Die Funktion unterhält eine Hashtabelle ($effectiveChildElementMap), in der die Liste der wirksamen Verhaltenseinstellungen während der Enumeration gespeichert ist. Der Inhalt der Hashtabelle ändert sich, während die Enumeration die Konfigurationshierarchie abwärts durchläuft. Z. B. wird eine Einstellung „X“ entfernt, wenn ein Element <remove name=”X”/> erkannt wird. Sobald die Enumeration abgeschlossen ist, entsprechen die Endwerte in der Hashtabelle der wirksamen Verhaltenskonfiguration des Diensts.

Hilfsfunktionen

  • FindBehaviorElementsByName – Findet alle <behavior>-Elemente, deren Attribut "name" dem angegebenen Namen entspricht.

  • IsClearTagPresent – Bestimmt, ob das Element <clear> sich unter dem angegebenen <behavior>-Element befindet.

  • IsRemoveTagPresent – Bestimmt, ob das Element <remove> mit dem entsprechenden Attribut "name" sich unter dem angegebenen <behavior>-Element befindet.

Known Issues/Limitations

  • Die Reihenfolge des <remove>/<clear>-Elements relativ zu den anderen Elementen unter dem gleichen übergeordneten <behavior>-Element kann von der Microsoft.Web.Administration-API nicht bestimmt werden. Für das Beispiel wird angenommen, dass die Elemente <remove> und <clear> zuerst auftreten.

  2011-12-05