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
, bindings
e 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 binding
endpoint
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>