Configuração simplificada
Configurar os serviços do Windows Communication Foundation (WCF) pode ser uma tarefa complexa. Existem muitas opções diferentes e nem sempre é fácil determinar quais configurações são necessárias. Embora os arquivos de configuração aumentem a flexibilidade dos serviços WCF, eles também são a fonte de muitos problemas difíceis de encontrar. O .NET Framework 4.6.1 resolve esses problemas e fornece uma maneira de reduzir o tamanho e a complexidade da configuração do serviço.
Configuração simplificada
Nos arquivos de configuração de serviço WCF, a <system.serviceModel>
seção contém um <service>
elemento para cada serviço hospedado. O <service>
elemento contém uma coleção de elementos que especificam os pontos de <endpoint>
extremidade expostos para cada serviço e, opcionalmente, um conjunto de comportamentos de serviço. Os <endpoint>
elementos especificam o endereço, a vinculação e o contrato expostos pelo ponto de extremidade e, opcionalmente, a configuração de vinculação e os comportamentos de ponto de extremidade. A <system.serviceModel>
seção também contém um <behaviors>
elemento que permite especificar comportamentos de serviço ou ponto de extremidade. O exemplo a seguir mostra a <system.serviceModel>
seção de um arquivo de configuração.
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="MyServiceBehavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<basicHttpBinding>
<binding name=MyBindingConfig"
maxBufferSize="100"
maxReceiveBufferSize="100" />
</basicHttpBinding>
</bindings> <services>
<service behaviorConfiguration="MyServiceBehavior"
name="MyService">
<endpoint address=""
binding="basicHttpBinding"
contract="ICalculator"
bindingConfiguration="MyBindingConfig" />
<endpoint address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange"/>
</service>
</services>
</system.serviceModel>
O .NET Framework 4.6.1 facilita a configuração de um serviço WCF removendo o requisito para o <service>
elemento . Se você não adicionar uma <service>
seção ou adicionar pontos de extremidade em uma <service>
seção e seu serviço não definir programaticamente nenhum ponto de extremidade, um conjunto de pontos de extremidade padrão será adicionado automaticamente ao seu serviço, um para cada endereço base de serviço e para cada contrato implementado pelo seu serviço. Em cada um desses pontos de extremidade, o endereço do ponto de extremidade corresponde ao endereço base, a vinculação é determinada pelo esquema de endereço base e o contrato é o implementado pelo seu serviço. Se você não precisar especificar nenhum ponto de extremidade ou comportamento de serviço ou fazer alterações de configuração de vinculação, não precisará especificar um arquivo de configuração de serviço. Se um serviço implementa dois contratos e o host habilita os transportes HTTP e TCP, o host de serviço cria quatro pontos de extremidade padrão, um para cada contrato usando cada transporte. Para criar pontos de extremidade padrão, o host de serviço deve saber quais associações usar. Essas configurações são especificadas em uma <protocolMappings>
seção dentro da <system.serviceModel>
seção. A <protocolMappings>
seção contém uma lista de esquemas de protocolo de transporte mapeados para tipos de vinculação. O host de serviço usa os endereços base passados para ele para determinar qual associação usar. O exemplo a seguir usa o <protocolMappings>
elemento .
Aviso
A alteração de elementos de configuração padrão, como associações ou comportamentos, pode afetar os serviços definidos em níveis inferiores da hierarquia de configuração, uma vez que eles podem estar usando essas associações e comportamentos padrão. Assim, quem altera ligações e comportamentos padrão precisa estar ciente de que essas alterações podem afetar outros serviços na hierarquia.
Nota
Os serviços hospedados no IIS (Serviços de Informações da Internet) ou no Serviço de Ativação de Processos do Windows (WAS) usam o diretório virtual como endereço base.
<protocolMapping>
<add scheme="http" binding="basicHttpBinding" bindingConfiguration="MyBindingConfig"/>
<add scheme="net.tcp" binding="netTcpBinding"/>
<add scheme="net.pipe" binding="netNamedPipeBinding"/>
<add scheme="net.msmq" binding="netMSMQBinding"/>
</protocolMapping>
No exemplo anterior, um ponto de extremidade com um endereço base que começa com o esquema "http" usa o BasicHttpBinding. Um ponto de extremidade com um endereço base que começa com o esquema "net.tcp" usa o NetTcpBinding. Você pode substituir as configurações em um arquivo App.config ou Web.config local.
Cada elemento dentro da <protocolMappings>
seção deve especificar um esquema e uma ligação. Opcionalmente, ele pode especificar um bindingConfiguration
atributo que especifica uma configuração de associação dentro da <bindings>
seção do arquivo de configuração. Se não bindingConfiguration
for especificado, a configuração de vinculação anônima do tipo de associação apropriado será usada.
Os comportamentos de serviço são configurados para os pontos de extremidade padrão usando seções anônimas <behavior>
dentro <serviceBehaviors>
de seções. Todos os elementos sem nome <behavior>
são <serviceBehaviors>
usados para configurar comportamentos de serviço. Por exemplo, o arquivo de configuração a seguir permite a publicação de metadados de serviço para todos os serviços dentro do host.
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="True"/>
</behavior>
</serviceBehaviors>
</behaviors> <!-- No <service> tag is necessary. Default endpoints are added to the service -->
<!-- The service behavior with name="" is picked up by the service -->
</system.serviceModel>
Os comportamentos de ponto de extremidade são configurados usando seções anônimas <behavior>
dentro <serviceBehaviors>
de seções.
O exemplo a seguir é um arquivo de configuração equivalente ao do início deste tópico que usa o modelo de configuração simplificado.
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<basicHttpBinding>
<binding maxBufferSize="100"
maxReceiveBufferSize="100" />
</basicHttpBinding>
</bindings>
<!-- No <service> tag is necessary. Default endpoints will be added to the service -->
<!-- The service behavior with name="" will be picked up by the service -->
<protocolMapping>
<add scheme="http" binding="basicHttpBinding" />
</protocolMapping>
</system.serviceModel>
Importante
Esse recurso está relacionado apenas à configuração do serviço WCF, não à configuração do cliente. Na maioria das vezes, a configuração do cliente WCF será gerada por uma ferramenta como svcutil.exe ou adicionando uma referência de serviço do Visual Studio. Se você estiver configurando manualmente um cliente WCF, precisará adicionar um <elemento de cliente> à configuração e especificar quaisquer pontos de extremidade que deseja chamar.