Configuração simplificada

Configurar serviços do WCF (Windows Communication Foundation) pode ser uma tarefa complexa. Há 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 origem 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 do serviço WCF, a seção <system.serviceModel> contém um elemento <service> para cada serviço hospedado. O elemento <service> contém uma coleção de elementos <endpoint> que especificam os pontos de extremidade expostos para cada serviço e, opcionalmente, um conjunto de comportamentos de serviço. Os elementos <endpoint> especificam o endereço, a associação e o contrato expostos pelo ponto de extremidade e, opcionalmente, associam comportamentos de configuração e ponto de extremidade. A seção <system.serviceModel> também contém um elemento <behaviors> que permite especificar os comportamentos do serviço ou do ponto de extremidade. O exemplo a seguir mostra a seção <system.serviceModel> 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 elemento <service>. Se você não adicionar uma seção <service> ou pontos de extremidade em uma seção <service> e o serviço não definir programaticamente os pontos de extremidade, um conjunto de pontos de extremidade padrão será adicionado automaticamente ao serviço, um para cada endereço base de serviço e para cada contrato implementado pelo serviço. Em cada um desses pontos de extremidade, o endereço do ponto de extremidade corresponde ao endereço base, a associação é determinada pelo esquema de endereço base e o contrato é implementado pelo serviço. Se você não precisar especificar os pontos de extremidade ou comportamentos de serviço nem fazer alterações na configuração de associação, não será necessário especificar um arquivo de configuração de serviço. Se um serviço implementar dois contratos e o host habilitar os transportes HTTP e TCP, o host de serviço criará 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 seção <protocolMappings> na seção <system.serviceModel>. A seção <protocolMappings> contém uma lista de esquemas de protocolo de transporte mapeados para os tipos de associaçã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 elemento <protocolMappings>.

Aviso

Alterar 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, pois podem usar essas associações e comportamentos padrão. Assim, quem altera associações e comportamentos padrão precisa estar ciente de que essas alterações podem afetar outros serviços na hierarquia.

Observação

Os serviços hospedados no IIS (Serviços de Informações da Internet) ou WAS (Serviço de Ativação de Processos do Windows) 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 local App.config ou Web.config.

Cada elemento na seção <protocolMappings> deve especificar um esquema e uma associação. Opcionalmente, ele pode especificar um atributo bindingConfiguration que especifica uma configuração de associação na seção <bindings> do arquivo de configuração. Se bindingConfiguration não for especificado, a configuração de associaçã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> nas seções <serviceBehaviors>. Todos os elementos sem nome <behavior> em <serviceBehaviors> são usados para configurar comportamentos de serviço. Por exemplo, o arquivo de configuração a seguir habilita a publicação de metadados de serviço para todos os serviços no 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 do ponto de extremidade são configurados usando seções anônimas <behavior> nas seções <serviceBehaviors>.

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, e 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 cliente> à configuração e especificar os pontos de extremidade que deseja chamar.

Confira também