Configuración simplificada

La configuración de servicios de Windows Communication Foundation (WCF) puede ser una tarea compleja. Existen muchas opciones diferentes y no siempre es fácil determinar qué configuración es necesaria. Aunque los archivos de configuración aumentan la flexibilidad de los servicios WCF, también son el origen de muchos problemas difíciles de detectar. .NET Framework 4.6.1 aborda estos problemas y proporciona una forma de reducir el tamaño y la complejidad de la configuración de los servicios.

Configuración simplificada

En los archivos de configuración de los servicios WCF, la sección <system.serviceModel> contiene un elemento <service> para cada servicio hospedado. El elemento <service> contiene una colección de elementos <endpoint> que especifican los puntos de conexión expuestos para cada servicio y, opcionalmente, un conjunto de comportamientos del servicio. Los elementos <endpoint> especifican la dirección, el enlace y el contrato expuestos por el punto de conexión y, opcionalmente, la configuración de enlace y los comportamientos de los puntos de conexión. La sección <system.serviceModel> también contiene un elemento <behaviors> que permite especificar los comportamientos de los servicios o los puntos de conexión. En el ejemplo siguiente, se muestra la sección <system.serviceModel> de un archivo de configuración.

<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>

.NET Framework 4.6.1 facilita la configuración de un servicio WCF porque elimina el requisito del elemento <service>. Si no agrega ninguna sección <service> ni ningún punto de conexión en una sección <service> y el servicio no define ningún punto de conexión mediante programación, entonces se agrega automáticamente al servicio un conjunto de puntos de conexión predeterminados, uno para la dirección base de cada servicio y para cada contrato implementado por el servicio. En cada uno de estos puntos de conexión, la dirección del punto de conexión corresponde a la dirección base, el esquema de la dirección base determina el enlace y el contrato es el implementado por el servicio. Si no necesita especificar ningún extremo o comportamientos del servicio, ni realizar ningún cambio de configuración de enlaces, no necesita especificar ningún archivo de configuración de servicio. Si un servicio implementa dos contratos y el host habilita transportes HTTP y TCP, el host de servicio crea cuatro extremos predeterminados, uno para cada contrato al usar cada transporte. Para crear extremos predeterminados, el host de servicio debe conocer qué enlaces hay que utilizar. Esta configuración se especifica en una sección <protocolMappings> dentro de la sección <system.serviceModel>. La sección <protocolMappings> contiene una lista de esquemas de protocolo de transporte asignada a los tipos de enlaces. El host de servicio usa las direcciones base que se le han transmitido para determinar qué enlace debe usar. El ejemplo siguiente usa el elemento <protocolMappings>.

Advertencia

Al cambiar los elementos de la configuración predeterminada, como los enlaces o los comportamientos, puede afectar a los servicios definidos en los niveles inferiores de la jerarquía de configuración, dado que podrían usar dichos enlaces y comportamientos predeterminados. Por lo tanto, siempre que cambien los enlaces y comportamientos predeterminados, es necesario tener en cuenta de que estos cambios podrían afectar a otros servicios de la jerarquía.

Nota

Los servicios hospedados en Internet Information Services (IIS) o en el Servicio de activación de procesos de Windows (WAS) usan el directorio virtual como su dirección 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>

En el ejemplo anterior, un punto de conexión con una dirección base que se inicia con el esquema de "http" utiliza el objeto BasicHttpBinding. Un extremo con una dirección base que se inicia con el esquema "net.tcp" usa NetTcpBinding. Puede invalidar la configuración en un archivo App.config o Web.config local.

Cada elemento de la sección <protocolMappings> debe especificar un esquema y un enlace. Opcionalmente, puede indicar un atributo bindingConfiguration que especifique una configuración de enlace dentro de la sección <bindings> del archivo de configuración. Si no se especifica bindingConfiguration, se utiliza la configuración de enlace anónima del tipo de enlace adecuado.

Para los puntos de conexión predeterminados, se configuran comportamientos de servicio utilizando secciones <behavior> anónimas dentro de secciones <serviceBehaviors>. Todos los elementos <behavior> sin nombre dentro de <serviceBehaviors> se utilizan para configurar comportamientos de servicio. Por ejemplo, el siguiente archivo de configuración habilita la publicación de metadatos del servicio para todos los servicios dentro del 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>

Los comportamientos de los puntos de conexión se configuran mediante secciones <behavior> anónimas dentro de secciones <serviceBehaviors>.

El siguiente ejemplo es un archivo de configuración equivalente al del principio de este tema que utiliza el modelo de configuración 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

Esta característica se relaciona únicamente con la configuración de servicio de WCF, no con la configuración de cliente. La mayoría de las veces, la configuración de cliente de WCF se generará mediante una herramienta como svcutil.exe o la adición de una referencia de servicio desde Visual Studio. Si configura manualmente un cliente WCF, debe agregar un elemento <client> a la configuración y especificar los puntos de conexión que desee llamar.

Consulte también