Configurando ligações para o Windows Communication Foundation Services

Ao criar um aplicativo, muitas vezes você deseja adiar decisões para o administrador após a implantação do aplicativo. Por exemplo, muitas vezes não há como saber com antecedência qual será um endereço de serviço, ou URI (Uniform Resource Identifier). Em vez de codificar um endereço, é preferível permitir que um administrador o faça depois de criar um serviço. Esta flexibilidade é conseguida através da configuração.

Nota

Use a ServiceModel Metadata Utility Tool (Svcutil.exe) com o /config switch para criar rapidamente arquivos de configuração.

Secções principais

O esquema de configuração do Windows Communication Foundation (WCF) inclui as seguintes três seções principais (serviceModel, bindingse services):

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

Elementos ServiceModel

Você pode usar a seção limitada pelo system.ServiceModel elemento para configurar um tipo de serviço com um ou mais pontos de extremidade, bem como configurações para um serviço. Cada ponto de extremidade pode ser configurado com um endereço, um contrato e uma vinculação. Para obter mais informações sobre pontos de extremidade, consulte Visão geral da criação de pontos de extremidade. Se nenhum ponto de extremidade for especificado, o tempo de execução adicionará pontos de extremidade padrão. Para obter mais informações sobre pontos de extremidade padrão, associações e comportamentos, consulte Configuração simplificada e configuração simplificada para serviços WCF.

Uma associação especifica transportes (HTTP, TCP, pipes, enfileiramento de mensagens) e protocolos (segurança, confiabilidade, fluxos de transação) e consiste em elementos de ligação, cada um dos quais especifica um aspeto de como um ponto de extremidade se comunica com o mundo.

Por exemplo, especificar o <elemento basicHttpBinding> indica usar HTTP como o transporte para um ponto de extremidade. Isso é usado para conectar o ponto de extremidade em tempo de execução quando o serviço que usa esse ponto de extremidade é aberto.

Existem dois tipos de ligações: predefinidas e personalizadas. As associações predefinidas contêm combinações úteis de elementos que são usados em cenários comuns. Para obter uma lista de tipos de vinculação predefinidos que o WCF fornece, consulte Ligações fornecidas pelo sistema. Se nenhuma coleção de vinculação predefinida tiver a combinação correta de recursos de que um aplicativo de serviço precisa, você poderá construir associações personalizadas para atender aos requisitos do aplicativo. Para obter mais informações sobre associações personalizadas, consulte <customBinding>.

Os quatro exemplos a seguir ilustram as configurações de vinculação mais comuns usadas para configurar um serviço WCF.

Especificando um ponto de extremidade para usar um tipo de associação

O primeiro exemplo ilustra como especificar um ponto de extremidade configurado com um endereço, um contrato e uma ligação.

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

Neste exemplo, o atributo indica para name qual tipo de serviço a configuração se destina. Quando você cria um serviço em seu código com o HelloWorld contrato, ele é inicializado com todos os pontos de extremidade definidos na configuração de exemplo. Se o assembly implementar apenas um contrato de serviço, o name atributo pode ser omitido porque o serviço usa o único tipo disponível. O atributo usa uma cadeia de caracteres, que deve estar no formato Namespace.Class, AssemblyName, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null

O address atributo especifica o URI que outros pontos de extremidade usam para se comunicar com o serviço. O URI pode ser um caminho absoluto ou relativo. Se um endereço relativo for fornecido, espera-se que o host forneça um endereço base apropriado para o esquema de transporte usado na associação. Se um endereço não estiver configurado, presume-se que o endereço base seja o endereço desse ponto de extremidade.

O contract atributo especifica o contrato que este ponto de extremidade está expondo. O tipo de implementação de serviço deve implementar o tipo de contrato. Se uma implementação de serviço implementa um único tipo de contrato, essa propriedade pode ser omitida.

O binding atributo seleciona uma associação predefinida ou personalizada a ser usada para esse ponto de extremidade específico. Um ponto de extremidade que não seleciona explicitamente uma associação usa a seleção de associação padrão, que é BasicHttpBinding.

Modificando uma vinculação predefinida

No exemplo a seguir, uma ligação predefinida é modificada. Em seguida, ele pode ser usado para configurar qualquer ponto de extremidade no serviço. A ligação é modificada definindo o ReceiveTimeout valor como 1 segundo. Observe que a propriedade retorna um TimeSpan objeto.

Essa ligação alterada encontra-se na secção de ligações. Essa associação alterada agora pode ser usada ao criar qualquer ponto de extremidade definindo o bindingendpoint atributo no elemento .

Nota

Se você der um nome específico à associação, o bindingConfiguration especificado no ponto de extremidade do serviço deverá corresponder a ele.

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

Configurando um comportamento a ser aplicado a um serviço

No exemplo a seguir, um comportamento específico é configurado para o tipo de serviço. O ServiceMetadataBehavior elemento é usado para habilitar a ServiceModel Metadata Utility Tool (Svcutil.exe) para consultar o serviço e gerar documentos WSDL (Web Services Description Language) a partir dos metadados.

Nota

Se você der um nome específico ao comportamento, o behaviorConfiguration especificado na seção de serviço ou ponto de extremidade deverá correspondê-lo.

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

A configuração anterior permite que um cliente chame e obtenha os metadados do serviço digitado "HelloWorld".

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

Especificando um serviço com dois pontos de extremidade usando valores de vinculação diferentes

Neste último exemplo, dois pontos de extremidade são configurados para o HelloWorld tipo de serviço. Cada ponto de extremidade usa um atributo personalizado bindingConfiguration diferente do mesmo tipo de associação (cada um modifica o 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>  

Você pode obter o mesmo comportamento usando a configuração padrão adicionando uma protocolMapping seção e configurando as associações, conforme demonstrado no exemplo a seguir.

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

Consulte também