Compartir a través de


Creación de enlaces definidos por el usuario

Hay varias maneras de crear enlaces no proporcionadas por el sistema:

  • Cree un enlace personalizado, basado en la clase CustomBinding, que es un contenedor que rellena de elementos de enlace. El enlace personalizado se agrega a continuación a un extremo de servicio. Puede crear el enlace personalizado mediante programación o mediante un archivo de configuración de la aplicación. Para utilizar un elemento de enlace desde un archivo de configuración de la aplicación, el elemento de enlace debe extender BindingElementExtensionElement. Para obtener más información acerca de enlaces personalizados, vea Enlaces personalizados y CustomBinding.
  • Puede crear una clase que derive de un enlace estándar. Por ejemplo, puede derivar una clase de WSHttpBinding e invalidar el método CreateBindingElements para obtener los elementos de enlace e insertar un elemento de enlace personalizado o establecer un valor determinado de seguridad.
  • Puede crear un nuevo tipo Binding para controlar completamente toda la implementación del enlace.

El orden de elementos de enlace

Cada elemento de enlace representa un paso del procesamiento al enviar y recibir mensajes. En tiempo de ejecución, los elementos de enlace crean los canales y agentes de escucha necesarios para generar pilas de canales entrantes y salientes.

Hay tres tipos principales de elementos de enlace: elementos de enlaces protocolares, elementos de enlaces de codificación y elementos de enlaces de transporte.

Elementos de enlaces protocolares: estos elementos representan pasos de procesamiento de nivel superior que actúan sobre mensajes. Los canales y los agentes de escucha creados por estos elementos de enlace pueden agregar, quitar o modificar el contenido del mensaje. Un enlace determinado puede tener un número aleatorio de elementos de enlaces protocolares, donde cada uno hereda de BindingElement. Windows Communication Foundation (WCF) incluye varios elementos de enlaces protocolares, incluyendo el ReliableSessionBindingElement y el SymmetricSecurityBindingElement.

Elemento de enlace de codificación: estos elementos representan las transformaciones entre un mensaje y una codificación lista para la transmisión en la conexión. Entre los enlaces de WCF típicos se incluyen exactamente un elemento de enlace de codificación. Entre los ejemplos de elementos de enlace de codificación se incluyen los elementos MtomMessageEncodingBindingElement, BinaryMessageEncodingBindingElement y TextMessageEncodingBindingElement. Si no se especifica un elemento de enlace de codificación para un enlace, se utiliza una codificación predeterminada. Cuando el transporte es HTTP, el valor predeterminado es texto, y, si no fuese HTTP, es binario.

Elemento de enlace de transporte: estos elementos representan la transmisión de un mensaje de codificación sobre un protocolo de transporte. Entre los enlaces de WCF típicos se incluye exactamente un elemento de enlace del transporte, que hereda a partir de TransportBindingElement. Entre los ejemplos de elementos de enlace del transporte se incluyen los elementos TcpTransportBindingElement, HttpTransportBindingElement y NamedPipeTransportBindingElement.

Al crear nuevos enlaces, el orden de los elementos de enlace agregados es importante. Siempre agregue los elementos de enlace en el siguiente orden:

Capa Opciones Requerido

Flujo de transacción

System.ServiceModel.Channels.TransactionFlowBindingElement

No

Confiabilidad

System.ServiceModel.Channels.ReliableSessionBindingElement

No

Seguridad

System.ServiceModel.Channels.SecurityBindingElement

No

Dúplex compuesto

System.ServiceModel.Channels.CompositeDuplexBindingElement

No

Codificación

Texto, binario, MTOM, personalizado

Sí*

Transporte

TCP, canalizaciones con nombre, HTTP, HTTPS, MSMQ, personalizado

*Dado que se requiere una codificación para cada enlace, si no se especifica una codificación, WCF agrega una codificación predeterminada. El valor predeterminado es texto/XML para los transportes HTTP y HTTPS, y binario para otros transportes.

Creación de un nuevo elemento de enlace

Además de los tipos derivados de BindingElement que proporciona WCF, puede crear sus propios elementos de enlace. Esto le permite personalizar la manera en la que se crea la pila de enlaces y los componentes que van en ella creando su propio BindingElement que puede componerse con el resto de tipos proporcionados por el sistema en la pila.

Por ejemplo, si implementa un LoggingBindingElement que proporciona la capacidad de registrar el mensaje en una base de datos, debe colocarlo sobre un canal de transporte en la pila de canales. En este caso, la aplicación crea un enlace personalizado que compuso el LoggingBindingElement con TcpTransportBindingElement, como en el siguiente ejemplo.

Binding customBinding = new CustomBinding(
  new LoggingBindingElement(), 
  new TcpTransportBindingElement()
);

La forma en la que escribe su nuevo elemento de enlace depende de su funcionalidad exacta. Uno de los ejemplos, Transport: UDP, proporciona una descripción detallada sobre cómo implementar un tipo de elemento de enlace.

Crear un nuevo enlace

Un elemento de enlace creado por el usuario se puede utilizar de dos maneras. La sección anterior muestra la primera manera: a través de un enlace personalizado. Un enlace personalizado le permite al usuario crear su propio enlace en función de un conjunto arbitrario de elementos de enlace, incluso los creados por usuario.

Si utiliza el enlace en más de una aplicación, cree su propio enlace y extienda el Binding. Esto evita crear manualmente un enlace personalizado cada vez que desee utilizarlo. Un enlace definido por el usuario le permite definir el comportamiento del enlace e incluir elementos de enlace definidos por el usuario. Y está preempaquetado: no tiene que volver a generar el enlace cada vez que lo utilice.

Como mínimo, un enlace definido por el usuario deberá implementar el método CreateBindingElements y la propiedad Scheme.

El método CreateBindingElements devuelve un nuevo BindingElementCollection que contiene los elementos de enlace del enlace. Se ordena la colección y debería contener primero los elementos de enlace protocolares, seguidos por el elemento de enlace de la codificación, seguido por el elemento de enlace de transporte. Al utilizar los elementos de enlace proporcionado por el sistema WCF, debe seguir las reglas de ordenamiento de elementos de enlace especificadas en Enlaces personalizados. Esta colección nunca debería hacer referencia a objetos a los que se ha hecho referencia dentro de la clase de enlace definida por el usuario; por consiguiente, los autores de enlaces deben devolver un Clone() de la BindingElementCollection en cada llamada a CreateBindingElements.

La propiedad Scheme representa el esquema del URI para el protocolo de transporte que se está utilizando en el enlace. Por ejemplo, WSHttpBinding y NetTcpBinding devuelven “http” y “net.tcp” a partir de sus propiedades de Scheme respectivas.

Para obtener una lista completa de métodos opcionales y propiedades para los enlaces definidos por el usuario, vea Binding.

Ejemplo

Este ejemplo implementa el enlace del perfil en SampleProfileUdpBinding, que deriva de Binding. El SampleProfileUdpBinding contiene hasta cuatro elementos de enlace dentro de él: un UdpTransportBindingElementcreado por usuario; y tres TextMessageEncodingBindingElement, CompositeDuplexBindingElementy ReliableSessionBindingElement proporcionados por el sistema.

public override BindingElementCollection CreateBindingElements()
{   
    BindingElementCollection bindingElements = new BindingElementCollection();
    if (ReliableSessionEnabled)
    {
        bindingElements.Add(session);
        bindingElements.Add(compositeDuplex);
    }
    bindingElements.Add(encoding);
    bindingElements.Add(transport);
    return bindingElements.Clone();
}

Restricciones de Seguridad con contratos dúplex

No todos los elementos de enlace son compatibles entre sí. En concreto, hay algunas restricciones con respecto a elementos de enlaces de seguridad cuando se utilizan con contratos dúplex.

Seguridad monoestable

Puede implementar la seguridad "monoestable", donde todas las credenciales de seguridad necesarias se envían en un único mensaje, estableciendo el atributo negotiateServiceCredential del elemento de configuración del <mensaje> en false.

La autenticación monoestable no trabaja con contratos dúplex.

Para contratos de solicitud‑respuesta, la autenticación monoestable sólo funciona si la pila de enlaces bajo el elemento de enlace de seguridad admite la creación de instancias de IRequestChannel o IRequestSessionChannel.

Para contratos unidireccionales, la autenticación monoestable funciona si la pila de enlaces bajo el elemento de enlace de seguridad admite la creación de instancias de IRequestChannel, IRequestSessionChannel, IOutputChannel o IOutputSessionChannel.

Los tokens de contexto de seguridad de modo de cookie no se pueden utilizar con contratos dúplex.

Para contratos de solicitud‑respuesta, los tokens de contexto de seguridad del modo de cookie sólo funcionan si la pila de enlaces bajo el elemento de enlace de seguridad admite la creación de instancias de IRequestChannel o IRequestSessionChannel.

Para contratos unidireccionales, los tokens de contexto de seguridad del modo de cookie funcionan si la pila de enlaces bajo el elemento de enlace de seguridad admite la creación de instancias de IRequestChannel o IRequestSessionChannel.

Tokens de contexto de seguridad de modo de sesión

El SCT de modo de sesión funciona con contratos dúplex si la pila de enlaces bajo el elemento de enlace de seguridad permite crear instancias de IDuplexChannel o IDuplexSessionChannel.

El SCT de modo de sesión funciona con contratos de solicitud‑respuesta si la pila de enlaces bajo el elemento de enlace de seguridad permite crear instancias de IDuplexChannel, IDuplexSessionChannel, IRequestChannel o IRequestSessionChannel.

El SCT de modo de sesión funciona con contratos unidireccionales si la pila de enlaces bajo el elemento de enlace de seguridad permite crear instancias de IDuplexChannel, IDuplexSessionChannel, IRequestChannel o IRequestSessionChannel.

Derivación a partir de un enlace estándar

En lugar de crear una clase de enlace completamente nueva, puede que sea posible extender uno de los enlaces existentes proporcionados por el sistema. De manera muy similar al caso anterior, debe invalidar el método CreateBindingElements y la propiedad Scheme.

Consulte también

Referencia

Binding

Conceptos

Enlaces personalizados