Compartir vía


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

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

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

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