Condividi tramite


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

Utilizzare lo strumento ServiceModel Metadata Utility Tool (Svcutil.exe) con l'opzione /config per creare rapidamente file di configurazione.

Sezioni principali

Lo schema di configurazione di Windows Communication Foundation (WCF) è composto da tre sezioni principali (serviceModel, bindings services):

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

Elementi ServiceModel

È possibile utilizzare 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 ulteriori informazioni sugli endpoint, vedere Cenni preliminari sulla creazione di endpoint.

Un'associazione specifica trasporti (HTTP, TCP, pipe, Accodamento messaggi) e protocolli (protezione, 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 utilizzato 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 di tipi di associazioni predefinite disponibili in WCF, vedere Associazioni fornite dal sistema. Se nessun insieme 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 ulteriori informazioni sulle associazioni personalizzate, vedere <customBinding>.

Nei quattro esempi seguenti vengono illustrate le configurazioni di associazione più comuni utilizzate 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 type="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" />
  </endpoint>
</service>

In questo esempio l'attributo type 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 type perché il servizio utilizza 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 e denominata. 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 viene trovata nella sezione delle associazioni e le viene assegnato un nome univoco, shortTimeout, impostato dall'attributo name. L'associazione alterata può a questo punto essere utilizzata durante la creazione di qualsiasi endpoint impostando l'attributo binding nell'elemento endpoint sul nome univoco. In questo modo è possibile disporre di un numero quasi illimitato di variazioni dell'associazione standard.

Nota

Se non si creano variazioni di un'associazione standard, non è necessario impostare l'attributo bindingConfiguration su un valore. Verrà quindi utilizzata l'associazione predefinita non modificata.

<service type="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" />
  </endpoint>
</service>
<bindings>
    <basicHttpBinding 
        name="shortTimeout"
        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 metadataPublishing viene utilizzato per consentire allo strumento ServiceModel Metadata Utility Tool (Svcutil.exe) di eseguire una query nel servizio e generare documenti WSDL (Web Services Description Language) dai metadati.

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

La configurazione precedente consente a un client di chiamare

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

e di ottenere i metadati del servizio "HelloWorld".

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

Nell'ultimo esempio sono configurati due endpoint per il tipo di servizio Hello. Ogni endpoint utilizza un attributo bindingConfiguration personalizzato diverso dello stesso tipo di associazione (ognuno modifica l'associazione basicHttpBinding).

<service type="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"
        bindingConfiguration="shortTimeout"
    </endpoint>
    <endpoint
        address="http://computer:8080/Hello"
        contract="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
        binding="basicHttpBinding"
        bindingConfiguration="Secure"
     </endpoint>
</service>
<bindings>
    <basicHttpBinding 
        name="shortTimeout"
        timeout="00:00:00:01" 
     />
     <basicHttpBinding 
        name="Secure" />
        <Security mode="Transport" />
</bindings>

Vedere anche

Concetti

Associazioni fornite dal sistema
Cenni preliminari sulla creazione di endpoint
Utilizzo di associazioni per configurare servizi e client