Script do Windows PowerShell para detectar a localização da configuração do comportamento dos serviços

O WCF 4.0 adiciona um recurso para mesclar comportamentos de serviço de vários arquivos de configuração na hierarquia de configuração. Esse recurso facilita a definição de comportamentos comuns em um arquivo de configuração de alto nível (por exemplo, web.config no nível do site) e de comportamentos adicionais em arquivos de configurações inferiores. O exemplo a seguir ilustra como isso funciona:

Web.config no nível do site

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

Web.config no nível do aplicativo

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

Um serviço WCF que está dentro do aplicativo e é configurado para usar o “MyBehavior” herdará efetivamente as configurações serviceDebug/serviceMetadata e etwTracking. Mais detalhes sobre a configuração de comportamento mesclada podem ser encontrados em Fusão de comportamento na configuração do WCF 4.0 (https://go.microsoft.com/fwlink/?LinkId=194422) e Comportamento padrão da fusão de configuração do .NET(a (https://go.microsoft.com/fwlink/?LinkId=194423) (as páginas podem estar em inglês).

Apesar da flexibilidade da configuração de comportamento mesclado, algumas vezes ele gera confusão porque a configuração de comportamento efetivo do serviço pode ser diferente da definida no web.config local. Esse exemplo demonstra como gravar um script do PowerShell, na forma de um cmdlet, que analisa a configuração de comportamento do serviço e reporta os locais dos arquivos de configuração que contêm as configurações efetivas.

Observação

Os exemplos são fornecidos apenas para fins educacionais. Eles não devem ser usados em um ambiente de produção e não foram testados em um ambiente de produção. A Microsoft não oferece suporte técnico para esses exemplos.

Pré-requisitos

Os usuários devem se familiarizar com o script do Windows PowerShell e os cmdlets do AppFabric.

O exemplo tem os seguintes pré-requisitos:

  • O PowerShell v2 deve estar instalado.

  • A instalação padrão do AppFabric deve ter sido realizada.

Localização do exemplo e arquivos

Os arquivos de exemplo são os seguintes:

  • Readme.mhtml

  • Code\detectServiceBehaviorConfigLocation.ps1

Configurando e executando esse exemplo

  1. O exemplo a seguir mostra como executar o cmdlet do script em um console do 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
    

    Observação

    Você pode precisar mudar a diretiva de execução de 'Restricted' para 'RemoteSigned' para que o exemplo funcione.

    Observação

    O cmdlet Get-ServiceBehaviorConfigLocation tem dois parâmetros que especificam o SiteName e o VirtualPath de um serviço de destino e retornam uma lista de definições efetivas de configuração de comportamento, que inclui localizações do arquivo de configuração no formato de caminho do IIS.

  2. O cmdlet também aceita saída do cmdlet Get-ASAppService do AppFabric por meio do pipeline. Isso permite, entre outras coisas, que o cmdlet funcione com todos os serviços descobertos em um escopo especificado, que é demonstrado no próximo exemplo:

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

    Uma lista de serviços encontrada pelo Get-ASAppService é transportada para o Get-ServiceBehaviorConfigLocation e a cláusula foreach é usada para formatar a saída final. Observe que ela adiciona cada SiteName e VirtualPath do serviço ao resultado original para que os serviços e suas configurações de comportamento possam ser correlacionados.

Removendo esse exemplo

  1. Feche a execução do PowerShell já que a execução desse exemplo não modifica nenhum recurso do computador.

Demonstra

O script desse exemplo tem quatro seções:

Inicialização

A primeira parte do script garante que todas as dependências sejam carregadas. Isso inclui carregar o módulo de cmdlet do AppFabric e a biblioteca Microsoft.Web.Administration para leitura da configuração do 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

Função do cmdlet

Outro objetivo desse exemplo é demonstrar como criar um cmdlet no script em vez de no código. O Get-ServiceBehaviorConfigLocation é a função que define o cmdlet. Diferente de uma função normal em scripts do PowerShell, ele contém Param, Process, e End, para definir conjuntos de parâmetros do cmdlet, lógica para gravar processamento e lógica para limpar, respectivamente.

Em nosso caso, essa função de cmdlet é responsável apenas pela normalização do parâmetro de entrada e chama a função GetBehaviorConfigLocationPerService, que contém a lógica principal para detecção do local das definições de configuração de comportamento.

A função principal

A função principal GetBehaviorConfigLocationPerService primeiro abre o arquivo de configuração no escopo do serviço. O exemplo usa uma API de código gerenciado no Microsoft.Web.Administration.dll para ler arquivos de configuração na hierarquia de configuração do IIS. O exemplo encontra todos os elementos <behavior> com uma configuração de serviço correspondente e enumera por meio de todos os elementos filho de cada um.

A função mantém uma tabela de hash ($effectiveChildElementMap) que armazena a lista de configuração de comportamento efetivo durante a enumeração. O conteúdo da tabela de hash evolui conforme a enumeração passa pela hierarquia de configuração, por exemplo, uma configuração X será removida se um elemento <remove name=”X”/> for observado. Depois que a enumeração estiver concluída, os valores finais na tabela de hash corresponderão à configuração de comportamento efetivo do serviço.

Funções do auxiliar

  • FindBehaviorElementsByName - Encontra todos os elementos <behavior> com o atributo "name" correspondente ao nome especificado.

  • IsClearTagPresent - Determina se o elemento <clear> está presente no elemento <behavior> especificado.

  • IsRemoveTagPresent - Determina se o elemento <remove> com o atributo "name" correspondente está presente no elemento <behavior> especificado.

Known Issues/Limitations

  • A ordem do elemento <remove>/<clear> relativa a outros elementos no mesmo elemento <behavior> pai não pode ser determinada pela API Microsoft.Web.Administration. O exemplo pressupõe que os elementos <remove> e <clear> aparecem primeiro.

  2011-12-05