Compartilhar via


Configurando associações para serviços do Windows Communication Foundation

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

Observação

Use a Ferramenta de Utilitário de Metadados do ServiceModel (Svcutil.exe) com o comutador /confignome de arquivonome de arquivo para criar rapidamente arquivos de configuração.

Seções principais

O esquema de configuração do WCF (Windows Communication Foundation) inclui as três seções principais a seguir (serviceModelbindingse services):

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

Elementos ServiceModel

Você pode usar a seção limitada pelo elemento system.ServiceModel 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 associação. Para obter mais informações sobre pontos de extremidade, consulte Visão geral da criação de ponto de extremidade. Se nenhum ponto de extremidade for especificado, o runtime adicionará pontos de extremidade padrão. Para obter mais informações sobre pontos de extremidade, associações e comportamentos padrão, confira 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 associação, cada um dos quais especifica um aspecto 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.

Há dois tipos de associações: predefinidas e personalizadas. As associações predefinidas contêm combinações úteis de elementos usados em cenários comuns. Para obter uma lista de tipos de associação predefinidos que o WCF fornece, consulte Associações Fornecidas pelo Sistema. Se nenhuma coleção de associação predefinida tiver a combinação correta de recursos 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 como criar associações personalizadas, consulte <customBinding>.

Os quatro exemplos a seguir ilustram as configurações de associaçã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 associaçã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 name indica para qual tipo de serviço a configuração serve. Quando você cria um serviço em seu código com o contrato HelloWorld, 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 atributo name poderá 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 atributo address especifica o URI que outros pontos de extremidade usam para se comunicar com o serviço. A URI pode ser tanto um caminho absoluto quanto 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, o endereço base será considerado o endereço desse ponto de extremidade.

O atributo contract 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 implementar um único tipo de contrato, essa propriedade poderá ser omitida.

O atributo binding seleciona uma associação predefinida ou personalizada a ser usada para este 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 associação predefinida

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

Essa associação alterada é encontrada na seção de associações. Essa associação alterada agora pode ser usada ao criar qualquer ponto de extremidade definindo o atributo binding no elemento endpoint.

Observação

Se você der um nome específico à associação, o ponto de extremidade de serviço bindingConfiguration especificado 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 elemento ServiceMetadataBehavior é usado para habilitar a Ferramenta de Utilitário de Metadados do ServiceModel (Svcutil.exe) para consultar o serviço e gerar documentos WSDL (Linguagem de Descrição dos Serviços Web) dos metadados.

Observação

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

<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 associação diferentes

Neste último exemplo, dois pontos de extremidade são configurados para o tipo de serviço HelloWorld. 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 seção protocolMapping 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>  

Confira também