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