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 /config
nome 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 (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 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>