Compartir a través de


Configuración de enlaces para servicios Windows Communication Foundation

Al crear una aplicación, a menudo quiere aplazar las decisiones al administrador después de la implementación de la aplicación. Por ejemplo, a menudo no hay forma de saber de antemano qué dirección de servicio o identificador uniforme de recursos (URI) será. En lugar de codificar de forma rígida una dirección, es preferible permitir que un administrador lo haga después de crear un servicio. Esta flexibilidad se logra mediante 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 Windows Communication Foundation (WCF) incluye las tres secciones principales siguientes (serviceModel, bindingsy services):

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

Elementos ServiceModel

Puede usar la sección enlazada por el system.ServiceModel elemento para configurar un tipo de servicio con uno o varios puntos de conexión, así como la configuración de un servicio. Después, cada punto de conexión se puede configurar 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 punto de conexión, el tiempo de ejecución agrega puntos de conexión 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 para servicios WCF.

Un enlace especifica los transportes (HTTP, TCP, canalizaciones, Message Queuing) y protocolos (Seguridad, Confiabilidad, Flujos de transacción) y consta de elementos de enlace, cada uno de los cuales especifica un aspecto de cómo un punto de conexión se comunica con el mundo.

Por ejemplo, especificar el <elemento basicHttpBinding> indica que se debe usar HTTP como transporte para un punto de conexión. 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 usan en escenarios comunes. Para obtener una lista de los tipos de enlace predefinidos que proporciona WCF, consulte System-Provided Enlaces. Si ninguna colección de enlaces predefinida tiene la combinación correcta de características que necesita una aplicación de servicio, 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 más comunes que se usan para configurar un servicio WCF.

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

En el primer ejemplo se muestra cómo especificar un punto de conexión 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 name atributo indica para qué tipo de servicio está la configuración. Al crear un servicio en el código con el HelloWorld contrato, se inicializa con todos los puntos de conexión definidos en la configuración de ejemplo. Si el ensamblado implementa solo un contrato de servicio, se puede omitir el name atributo porque el servicio usa el único tipo disponible. El atributo toma una cadena, que debe estar en el formato . Namespace.Class, AssemblyName, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null

El address atributo especifica el URI que usan otros puntos de conexión para comunicarse con el 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 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 de ese punto de conexión.

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

El binding atributo selecciona un enlace predefinido o personalizado que se usará para este punto de conexión específico. Un punto de conexión que no selecciona explícitamente un enlace usa la selección de enlace predeterminada, que es BasicHttpBinding.

Modificar un enlace predefinido

En el ejemplo siguiente, se modifica un enlace predefinido. Después, se puede usar para configurar cualquier punto de conexión en el servicio. Estableciendo el valor de ReceiveTimeout en 1 segundo, se modifica la vinculación. Tenga en cuenta que la propiedad devuelve un TimeSpan objeto .

Ese enlace modificado se encuentra en la sección enlaces. Este enlace modificado ahora se puede utilizar para crear cualquier punto de conexión estableciendo el atributo binding en el elemento endpoint.

Nota:

Si asigna un nombre determinado al enlace, el 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>  

Configuración de un comportamiento para aplicar a un servicio

En el ejemplo siguiente, se configura un comportamiento específico para el tipo de servicio. El ServiceMetadataBehavior elemento se usa para habilitar la herramienta de utilidad de metadatos serviceModel (Svcutil.exe) para consultar el servicio y generar documentos del lenguaje de descripción de servicios web (WSDL) a partir de los metadatos.

Nota:

Si asigna un nombre determinado al comportamiento, el behaviorConfiguration especificado en la sección de servicio o 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 que un cliente llame a y obtenga los metadatos del servicio con tipo "HelloWorld".

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

Especificar un servicio con dos puntos de conexión mediante valores de enlace diferentes

En este último ejemplo, se configuran dos puntos de conexión para el tipo de HelloWorld servicio. Cada punto de conexión usa un atributo bindingConfiguration diferente, personalizado para el mismo tipo de enlace, y cada uno modifica el 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 mediante la configuración predeterminada agregando una protocolMapping sección y configurando los enlaces 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