Script de Windows PowerShell para detectar la ubicación de la configuración del comportamiento del servicio
WCF 4.0 tiene la capacidad de combinar comportamientos de servicio de varios archivos de configuración de la jerarquía de configuración. Esta característica facilita la definición de comportamientos comunes en archivos de configuración de nivel superior (por ejemplo, archivos web.config de nivel de sitio) y la definición de comportamientos adicionales en archivos de configuración de nivel inferior. En el ejemplo siguiente se ilustra su funcionamiento:
Archivo web.config de nivel de sitio
<configuration>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="MyBehavior">
<serviceDebug includeExceptionDetailInFaults="True" />
<serviceMetadata httpGetEnabled="True" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
Archivo web.config de nivel de aplicación
<configuration>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="MyBehavior">
<etwTracking profileName="Troubleshooting Tracking Profile" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
Un servicio WCF situado dentro de la aplicación y configurado para usar “MyBehavior” heredará la configuración de serviceDebug/serviceMetadata y etwTracking. Para obtener más información acerca de la configuración de comportamientos combinados, vea los temas sobre la configuración de comportamientos combinados en WCF 4.0 disponible en https://go.microsoft.com/fwlink/?LinkId=194422 y la configuración del comportamiento combinado predeterminado en .NET disponible en https://go.microsoft.com/fwlink/?LinkId=194423 (pueden estar en inglés).
A pesar de la flexibilidad de la configuración de los comportamientos combinados, en ocasiones crea confusión porque la configuración de comportamiento activa del servicio difiere de la definida en el archivo web.config local. Este ejemplo muestra la creación de un script de PowerShell en forma de cmdlet que analiza la configuración del comportamiento de servicio y notifica las ubicaciones de los archivos de configuración que contienen la configuración activa.
Nota
Los ejemplos se proporcionan únicamente con fines de aprendizaje. No están concebidos para su uso en un entorno de producción ni se han probado en este tipo de entorno. Microsoft no proporciona asistencia técnica para estos ejemplos.
Requisitos previos
Los usuarios deben estar familiarizados con el lenguaje de scripting de Windows PowerShell y los cmdlets de AppFabric.
Es necesario cumplir los siguientes requisitos previos del ejemplo:
PowerShell v2 está instalado
Se realizó la instalación predeterminada de AppFabric.
Ubicación y archivos de ejemplo
Entre los archivos de ejemplo se incluyen los siguientes:
Readme.mhtml
Code\detectServiceBehaviorConfigLocation.ps1
Configuración y ejecución de este ejemplo
En el ejemplo siguiente se muestra la ejecución del cmdlet de script desde una consola de 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
Nota
Puede que necesite cambiar la directiva de ejecución de ‘Restricted’ a ‘RemoteSigned’ para que funcione el ejemplo.
Nota
El cmdlet Get-ServiceBehaviorConfigLocation obtiene dos parámetros que especifican los valores SiteName y VirtualPath de un servicio de destino y devuelven una lista de opciones de configuración del comportamiento activo, como las ubicaciones del archivo de configuración en formato de ruta de IIS.
El cmdlet también acepta resultados del cmdlet Get-ASAppService de AppFabric mediante canalización. Entre otras cosas, esto permite al cmdlet trabajar con todos los servicios descubiertos en un ámbito determinado, como se muestra en el ejemplo siguiente:
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 ...
La lista de servicios que encontró Get-ASAppService se canaliza a Get-ServiceBehaviorConfigLocation y se usa la cláusula foreach para dar formato al resultado final. Tenga en cuenta que los valores SiteName y VirtualPath de cada servicio se agregan al resultado original, lo que permite correlacionar los servicios con su configuración de comportamiento.
Eliminación de este ejemplo
- Solo tiene que cerrar la sesión de PowerShell, ya que al ejecutar este ejemplo no se modifica ningún recurso del ordenador.
Demuestra
Este script de ejemplo consta de cuatro secciones:
Inicialización
La primera parte del script garantiza que se cargan todas las dependencias. Esto incluye la carga del módulo de cmdlets de AppFabric y la biblioteca Microsoft.Web.Administration para leer la configuración de IIS.
if ((Get-Command -Module ApplicationServer) -eq $null)
{
Import-Module ApplicationServer
}
[System.Reflection.Assembly]::LoadFrom( "C:\windows\system32\inetsrv\Microsoft.Web.Administration.dll" ) | Out-Null
Función del cmdlet
Otro objetivo de este ejemplo es mostrar la creación de un cmdlet en un script en lugar de un código. Get-ServiceBehaviorConfigLocation es la función que define el cmdlet. Al contrario de lo que sucede con las funciones normales de scripts de PowerShell, contiene los valores Param, Process y End, que permiten definir conjuntos de parámetros de cmdlets, lógica para el procesamiento de registros y lógica de limpieza, respectivamente.
En nuestro caso, esta función de cmdlet solo es responsable de la normalización del parámetro de entrada e invoca la función GetBehaviorConfigLocationPerService, que contiene la lógica principal de detección de la ubicación de la configuración de comportamiento.
La función principal
En primer lugar, la función principal GetBehaviorConfigLocationPerService abre el archivo de configuración en el ámbito del servicio. El ejemplo usa una API de código administrado en Microsoft.Web.Administration.dll para leer archivos de configuración en la jerarquía de configuración de IIS. El ejemplo busca todos los elementos de <comportamiento> con la misma configuración de servicio y enumera todos los elementos secundarios de cada uno.
La función mantiene una tabla hash ($effectiveChildElementMap) que almacena la lista de opciones de configuración de comportamiento activas durante la enumeración. El contenido de la tabla hash evoluciona a medida que la enumeración avanza hacia los niveles inferiores de la jerarquía de configuración. Por ejemplo, si se observa un elemento <remove name=”X”/>, se eliminará cualquier valor X. Al completar la enumeración, los valores finales de la tabla hash corresponden a la configuración de comportamiento activa del servicio.
Funciones de la aplicación auxiliar
FindBehaviorElementsByName: busca todos los elementos <behavior> cuyo atributo "name" coincide con el nombre especificado.
IsClearTagPresent: determina si existe algún elemento <clear> en el elemento <behavior> especificado.
IsRemoveTagPresent: determina si existe algún elemento <remove> con el mismo atributo "name" en el elemento <behavior> especificado.
Known Issues/Limitations
- La API Microsoft.Web.Administration no puede determinar el orden de un elemento <remove>/<clear> relacionado con otros con el mismo elemento <behavior> principal. En este ejemplo, se supone que los elementos <remove> y <clear> aparecen en primer lugar.
2012-03-05