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