Configuración de enlaces para servicios Windows Communication Foundation

Con frecuencia al crear una aplicación desea delegar las decisiones al administrador tras la implementación de la aplicación. Por ejemplo, a menudo no hay manera de conocer de antemano qué será una dirección de servicio o un URI. En lugar de incluir una dirección en el código, es preferible permitir a un administrador hacerlo después de crear un servicio. Esta flexibilidad se logra a través de la configuración.

Nota

Use la Herramienta de utilidad de metadatos de ServiceModel (Svcutil.exe) junto con el modificador /config para crear archivos de configuración rápidamente.

Secciones principales

El esquema de configuración de la infraestructura Windows Communication Foundation (WCF) incluye las siguientes tres secciones principales (serviceModel, bindings y services):

<configuration>  
    <system.serviceModel>  
        <bindings>  
        </bindings>  
        <services>  
        </services>  
        <behaviors>  
        </behaviors>  
    </system.serviceModel>  
</configuration>  

Elementos ServiceModel

Puede utilizar la sección que limita el elemento system.ServiceModel para configurar un tipo de servicio con uno o más puntos de conexión, así como los valores de un servicio. Cada extremo se puede configurar a continuación con una dirección, un contrato y un enlace. Para obtener más información sobre los puntos de conexión, consulte Información general sobre la creación de puntos de conexión. Si no se especifica ningún extremo, el tiempo de ejecución agrega extremos predeterminados. Para obtener más información sobre los puntos de conexión, enlaces y comportamientos predeterminados, vea Configuración simplificada y Configuración simplificada de los servicios de WCF.

Un enlace especifica transportes (HTTP, TCP, canalizaciones, Message Queuing) y protocolos (seguridad, confiabilidad, flujos de transacción) y está compuesto de elementos de enlace, cada uno de los cuales especifica un aspecto sobre cómo un punto de conexión se comunica con el mundo.

Por ejemplo, especificar el elemento <basicHttpBinding> equivaldrá a indicar que debe utilizarse HTTP como mecanismo de transporte en un extremo. Se utiliza para conectar el extremo en tiempo de ejecución cuando se abre el servicio utilizando este extremo.

Hay dos tipos de enlaces: predefinidos y personalizados. Los enlaces predefinidos contienen combinaciones útiles de elementos que se utilizan en escenarios comunes. Para obtener una lista de los tipo de enlace previamente definidos que se incluyen en WCF, consulte Enlaces proporcionados por el sistema. Si ninguna colección de enlace predefinido tiene la combinación correcta de características que una aplicación de servicio necesita, puede construir enlaces personalizados para satisfacer los requisitos de la aplicación. Para obtener más información sobre los enlaces personalizados, consulte <customBinding>.

En los cuatro ejemplos siguientes, se muestran las configuraciones de enlace que se usan más comúnmente a la hora de preparar un servicio WCF.

Especificar un punto de conexión para usar un tipo de enlace

El primer ejemplo muestra cómo especificar un extremo configurado con una dirección, un contrato y un enlace.

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

En este ejemplo, el atributo de name indica para qué tipo de servicio es la configuración. Al crear un servicio en su código con el contrato HelloWorld, se inicializa con todos los extremos definidos en la configuración del ejemplo. Si el ensamblado implementa un único contrato de servicios, puede omitirse el atributo name, ya que el servicio utilizará el único tipo que está disponible. El atributo toma una cadena, que debe tener el formato Namespace.Class, AssemblyName, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null

El atributo address especifica el URI que otros extremos utilizan para comunicarse con servicio. El URI puede ser una ruta de acceso absoluta o relativa. Si se proporciona una dirección relativa, se espera que el host proporcione una dirección base que sea adecuada para el esquema de transporte usado en el enlace. Si no se configura una dirección, se supone que la dirección base es la dirección para ese punto de conexión.

El atributo contract especifica el contrato que este punto de conexión está exponiendo. El tipo de implementación de servicio debe implementar el tipo de contrato. Si una implementación de servicio implementa un tipo de contrato único, entonces se puede omitir esta propiedad.

El atributo binding selecciona un enlace predefinido o personalizado para utilizarlo para este punto de conexión concreto. Un extremo que no selecciona explícitamente un enlace utiliza la selección de enlace predeterminada, que es BasicHttpBinding.

Modificar un enlace predefinido

En el ejemplo siguiente, se modifica un enlace predefinido. Se puede utilizar a continuación para configurar cualquier extremo en el servicio. El enlace se modifica estableciendo el valor ReceiveTimeout en 1 segundo. Observe que la propiedad devuelve un objeto TimeSpan.

Ese enlace alterado se encuentra en la sección de enlaces. Este enlace alterado se puede usar al crear cualquier punto de conexión estableciendo el atributo binding en el elemento endpoint.

Nota

Si asigna un nombre determinado al enlace, el atributo bindingConfiguration especificado en el punto de conexión de servicio debe coincidir con él.

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

Configurar un comportamiento para aplicarlo a un servicio

En el ejemplo siguiente, un comportamiento concreto se configura para el tipo de servicio. El elemento ServiceMetadataBehavior permite que la Herramienta de utilidad de metadatos de ServiceModel (Svcutil.exe) consulte el servicio y genere los documentos de lenguaje de descripción de servicios Web (WSDL) a partir de los metadatos.

Nota

Si asigna un nombre determinado al comportamiento, el atributo behaviorConfiguration especificado en el servicio o en la sección de punto de conexión debe coincidir con él.

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

La configuración anterior permite a un cliente llamar y obtener los metadatos del servicio con tipo "HelloWorld".

svcutil /config:Client.exe.config http://computer:8080/Hello?wsdl

Especificar un servicio con dos extremos usando valores de enlace diferentes

En este último ejemplo, dos extremos se configuran para el tipo de servicio HelloWorld. Cada punto de conexión usa un atributo bindingConfiguration personalizado diferente del mismo tipo de enlace (cada uno de ellos modifica el atributo 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>  

Puede obtener el mismo comportamiento usando la configuración predeterminada si agrega una sección protocolMapping y configura los enlaces, tal y como se muestra en el ejemplo siguiente.

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

Consulte también