Script di Windows PowerShell per il rilevamento del percorso della configurazione del comportamento del servizio

WCF 4.0 offre la possibilità di unire comportamenti di servizi da più file di configurazione nella gerarchia di configurazione. Questa funzionalità semplifica la definizione dei comportamenti comuni in un file di configurazione di alto livello (ad esempio, web.config a livello di sito) e definire comportamenti aggiuntivi in file di configurazione di livello inferiore. Nel seguente esempio viene illustrato il funzionamento di:

File web.config a livello di sito

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

File web.config a livello di applicazione

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

Un servizio WCF interno all'applicazione e configurato per l'utilizzo di “MyBehavior” erediterà entrambe le configurazioni serviceDebug/serviceMetadata e etwTracking. Ulteriori dettagli sulla configurazione del comportamento unito sono disponibili al sito Behavior Merge in WCF 4.0 Configuration (https://go.microsoft.com/fwlink/?LinkId=194422) e .NET Configuration Merge Default Behavior (https://go.microsoft.com/fwlink/?LinkId=194423).

Nonostante la flessibilità della configurazione del comportamento unito, talvolta si genera confusione in quanto la configurazione del comportamento del servizio può essere diversa da quella definita nel file locale web.config. In questo esempio viene illustrato come scrivere uno script PowerShell, in un modulo cmdlet, che analizza la configurazione del comportamento del servizio e riporta le posizioni dei file di configurazione contenenti le effettive impostazioni.

Nota

Gli esempi vengono forniti solo per scopi didattici. Non sono destinati a essere utilizzati in un ambiente di produzione e non sono stati testati in un ambiente di produzione. Microsoft non fornisce supporto tecnico per questi esempi.

Prerequisiti

È necessario che gli utenti abbiano familiarità con lo scripting di Windows PowerShell e cmdlet di AppFabric.

Nell'esempio si presuppongono i seguenti prerequisiti:

  • PowerShell v2 è installato.

  • L'installazione predefinita di AppFabric è stata eseguita.

Percorso e file di esempio

I file di esempio comprendono quanto segue:

  • Readme.mhtml

  • Code\detectServiceBehaviorConfigLocation.ps1

Installazione ed esecuzione dell'esempio

  1. Nell'esempio seguente viene illustrato come eseguire il cmdlet di script da una console 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

    È possibile che per l'esempio sia necessario cambiare il criterio di esecuzione da 'Restricted' a 'RemoteSigned'.

    Nota

    Il cmdlet Get-ServiceBehaviorConfigLocation utilizza due parametri, che specificano il nome del sito (SiteName) e il percorso virtuale (VirtualPath) di un servizio di destinazione, e restituisce un elenco di impostazioni di configurazione del comportamento comprendente le posizioni dei file di configurazione nel formato di percorso IIS.

  2. Il cmdlet accetta inoltre l'output del cmdlet Get-ASAppService di AppFabric mediante pipeline. Ciò consente inoltre al cmdlet di utilizzare tutti i servizi rilevati in un ambito specificato, come illustrato nell'esempio seguente:

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

    Un elenco di servizi disponibili in Get-ASAppService viene reindirizzato a Get-ServiceBehaviorConfigLocation e la clausola foreach viene utilizzata per il formato dell'output finale. Si noti che al risultato originale vengono aggiunti SiteName e VirtualPath a ciascun servizio in modo che i servizi e le relative impostazioni del comportamento possano essere messi in relazione.

Rimozione dell'esempio

  1. Chiudere semplicemente la sessione di PowerShell dal momento che l'esecuzione dell'esempio non comporta la modifica delle risorse del computer.

Dimostrazioni

Lo script di questo esempio comprende quattro sezioni:

Inizializzazione

La prima parte dello script assicura che tutte le dipendenze siano state caricate. Sono inclusi il caricamento del modulo cmdlet di AppFabric e la libreria Microsoft.Web.Administration per la lettura della configurazione 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

Funzione cmdlet

Un altro obiettivo di questo esempio è di illustrare come modificare un cmdlet in script invece che in codice. Get-ServiceBehaviorConfigLocation è la funzione che definisce il cmdlet. Diversamente dalla normale funzione degli script di PowerShell, contiene Param, Process e End, per definire set di parametri cmdlet, la logica per l'elaborazione dei record e la logica per la pulizia, rispettivamente.

Nel nostro caso, la funzione cmdlet è responsabile solo della normalizzazione del parametro di input e chiama la funzione GetBehaviorConfigLocationPerService, contenente la logica principale per il rilevamento della posizione delle impostazioni della configurazione del comportamento.

Funzione principale

La funzione principale GetBehaviorConfigLocationPerService apre dapprima il file di configurazione nell'ambito del servizio. In questo esempio viene utilizzata un'API di codice gestito in Microsoft.Web.Administration.dll per la lettura dei file di configurazione nella gerarchia di configurazione IIS. Tutti gli elementi del <comportamento> con una configurazione del servizio corrispondente vengono individuati e vengono enumerati gli elementi figlio di ciascuno.

La funzione gestisce una tabella hash ($effectiveChildElementMap) che memorizza l'elenco delle impostazioni del comportamento durante l'enumerazione. Il contenuto della tabella hash cambia man mano che l'enumerazione procede nella gerarchia di configurazione, ad esempio una impostazione X verrà rimossa se si osserva un elemento <remove name=”X”/>. Dopo il completamento dell'enumerazione, i valori finali della tabella hash corrisponderanno all'effettiva configurazione del comportamento del servizio.

Funzioni di helper

  • FindBehaviorElementsByName - Individua tutti gli elementi <behavior> il cui attributo "name" corrisponde al nome specificato.

  • IsClearTagPresent - Determina se l'elemento <clear> è presente nell'elemento <behavior> specificato.

  • IsRemoveTagPresent - Determina se l'elemento <remove> con l'attributo "name" corrispondente è presente nell'elemento <behavior> specificato.

Known Issues/Limitations

  • L'ordine dell'elemento <remove>/<clear> relativo agli altri elementi nello stesso elemento padre <behavior> non può essere determinato dall'API Microsoft.Web.Administration. Nell'esempio si presume che l'elemento <remove> e <clear> venga visualizzato per primo.

  2011-12-05