Configurazione di associazioni per i servizi Windows Communication Foundation

Durante la creazione di un'applicazione, è spesso necessario assegnare all'amministratore il compito di prendere alcune decisioni dopo la distribuzione dell'applicazione. Non è in alcun modo possibile, ad esempio, conoscere in anticipo l'indirizzo di un servizio, o URI (Uniform Resource Identifier). Anziché inserire un indirizzo nel codice, è preferibile consentire che questa operazione venga eseguita da un amministratore dopo la creazione del servizio. Questa flessibilità viene realizzata attraverso la configurazione.

Nota

Usare lo strumento ServiceModel Metadata Utility Tool (Svcutil.exe) con il passaggio /config per creare rapidamente i file di configurazione.

Sezioni principali

Lo schema di configurazione di Windows Communication Foundation (WCF) include le tre sezioni principali seguenti (serviceModel, bindings e services):

<configuration>  
    <system.serviceModel>  
        <bindings>  
        </bindings>  
        <services>  
        </services>  
        <behaviors>  
        </behaviors>  
    </system.serviceModel>  
</configuration>  

Elementi ServiceModel

È possibile usare la sezione delimitata dall'elemento system.ServiceModel per configurare un tipo di servizio con uno o più endpoint, nonché le impostazioni di un servizio. Ogni endpoint può essere quindi configurato con un indirizzo, un contratto e un'associazione. Per altre informazioni sugli endpoint, vedere Panoramica della creazione di endpoint. Se non è specificato alcun endpoint, il runtime aggiunge gli endpoint predefiniti. Per altre informazioni su endpoint, associazioni e comportamenti predefiniti, vedere Simplified Configuration (Configurazione semplificata) e Simplified Configuration for WCF Services (Configurazione semplificata per servizi WCF).

Un'associazione specifica trasporti (HTTP, TCP, pipe, Accodamento messaggi) e protocolli (sicurezza, affidabilità, flussi delle transazioni) e consiste in elementi, ognuno dei quali specifica un aspetto del modo in cui un endpoint comunica con l'esterno.

Se ad esempio si specifica l'elemento <basicHttpBinding>, il trasporto usato per un endpoint sarà HTTP. Ciò consente di associare l'endpoint in fase di esecuzione quando il servizio che utilizza l'endpoint è aperto.

Le associazioni sono di due tipi: predefinite e personalizzate. Le associazioni predefinite contengono combinazioni utili di elementi utilizzati in scenari comuni. Per un elenco dei tipi di binding predefiniti forniti da WCF, vedere Binding forniti dal sistema. Se nessuna raccolta di associazioni predefinite presenta la combinazione corretta delle funzionalità necessarie per un'applicazione di servizio, è possibile costruire associazioni personalizzate che soddisfino i requisiti dell'applicazione. Per altre informazioni sui binding personalizzati, vedere <customBinding>.

Nei quattro esempi seguenti vengono illustrate le configurazioni di binding più comuni usate per la configurazione di un servizio WCF.

Specificare un tipo di associazione per un endpoint

Nel primo esempio viene illustrato come specificare un endpoint configurato con un indirizzo, un contratto e un'associazione.

<service name="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null">  
  <!-- This section is optional with the default configuration introduced  
       in .NET Framework 4. -->  
  <endpoint
      address="/HelloWorld2/"  
      contract="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"  
      binding="basicHttpBinding" />
</service>  

In questo esempio l'attributo name indica il tipo di servizio per il quale è destinata la configurazione. Quando si crea un servizio nel codice con il contratto HelloWorld, viene inizializzato con tutti gli endpoint definiti nella configurazione di esempio. Se l'assembly implementa solo un contratto di servizio, è possibile omettere l'attributo name perché il servizio usa l'unico tipo disponibile. L'attributo accetta una stringa che deve presentarsi nel formato Namespace.Class, AssemblyName, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null

L'attributo address specifica l'URI utilizzato dagli altri endpoint per comunicare con il servizio. L'URI può essere assoluto o relativo. Se viene fornito un indirizzo relativo, l'host deve fornire un indirizzo di base appropriato per lo schema di trasporto utilizzato nell'associazione. Se non viene configurato un indirizzo, si presuppone che l'indirizzo di base valga come indirizzo per quell'endpoint.

L'attributo contract specifica il contratto esposto dall'endpoint. Il tipo di implementazione del servizio deve implementare il tipo di contratto. Se un'implementazione del servizio implementa un tipo di contratto singolo, questa proprietà può essere omessa.

L'attributo binding seleziona un'associazione predefinita o personalizzata da utilizzare per lo specifico endpoint. Un endpoint che non seleziona in modo esplicito un'associazione utilizza l'associazione predefinita, ovvero BasicHttpBinding.

Modifica di un'associazione predefinita

Nell'esempio seguente un'associazione predefinita viene modificata. Può quindi essere utilizzata per configurare qualsiasi endpoint nel servizio. L'associazione viene modificata impostando il valore della proprietà ReceiveTimeout su 1 secondo. Si noti che la proprietà restituisce un oggetto TimeSpan.

L'associazione alterata si trova nella sezione delle associazioni. L'associazione alterata può a questo punto essere utilizzata durante la creazione di qualsiasi endpoint impostando l'attributo binding nell'elemento endpoint.

Nota

Se si assegna un determinato nome all'associazione, bindingConfiguration specificato nell'endpoint del servizio deve corrispondere ad esso.

<service name="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null">  
  <endpoint
      address="/HelloWorld2/"  
      contract="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"  
      binding="basicHttpBinding" />
</service>  
<bindings>  
    <basicHttpBinding
        receiveTimeout="00:00:01"  
    />  
</bindings>  

Configurare un comportamento da applicare a un servizio

Nell'esempio seguente viene configurato un comportamento specifico per il tipo di servizio. L'elemento ServiceMetadataBehavior viene usato per abilitare lo strumento ServiceModel Metadata Utility (Svcutil.exe) per eseguire query sul servizio e generare documenti WSDL (Web Services Description Language) dai metadati.

Nota

Se si assegna un determinato nome al comportamento, behaviorConfiguration specificato nella sezione del servizio o dell'endpoint deve corrispondere ad esso.

<behaviors>  
    <behavior>  
        <ServiceMetadata httpGetEnabled="true" />
    </behavior>  
</behaviors>  
<services>  
    <service
       name="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null">
       <endpoint
          address="http://computer:8080/Hello"  
          contract="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"  
          binding="basicHttpBinding" />
    </service>  
</services>  

La configurazione precedente consente a un client di chiamare e di ottenere i metadati del servizio "HelloWorld".

svcutil /config:Client.exe.config http://computer:8080/Hello?wsdl

Specificare un servizio con due endpoint che utilizzano valori di associazione diversi

Nell'ultimo esempio sono configurati due endpoint per il tipo di servizio HelloWorld. Ogni endpoint usa un attributo bindingConfiguration personalizzato diverso dello stesso tipo di binding (ognuno modifica basicHttpBinding).

<service name="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null">  
    <endpoint  
        address="http://computer:8080/Hello1"  
        contract="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"  
        binding="basicHttpBinding"  
        bindingConfiguration="shortTimeout" />
    <endpoint  
        address="http://computer:8080/Hello2"  
        contract="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"  
        binding="basicHttpBinding"  
        bindingConfiguration="Secure" />
</service>  
<bindings>  
    <basicHttpBinding
        name="shortTimeout"  
        timeout="00:00:00:01"
     />  
     <basicHttpBinding
        name="Secure">  
        <Security mode="Transport" />  
     </basicHttpBinding>
</bindings>  

È possibile ottenere lo stesso comportamento utilizzando la configurazione predefinita mediante l'aggiunta di una sezione protocolMapping e la configurazione delle associazioni, come mostrato nell'esempio seguente.

<protocolMapping>  
    <add scheme="http" binding="basicHttpBinding" bindingConfiguration="shortTimeout" />  
    <add scheme="https" binding="basicHttpBinding" bindingConfiguration="Secure" />  
</protocolMapping>  
<bindings>  
    <basicHttpBinding
        name="shortTimeout"  
        timeout="00:00:00:01"
     />  
     <basicHttpBinding
        name="Secure" />  
        <Security mode="Transport" />  
</bindings>  

Vedi anche