Creación de un BindingElement
Los enlaces y elementos de enlace (objetos que extienden a las clases System.ServiceModel.Channels.Binding y System.ServiceModel.Channels.BindingElement, respectivamente) se usan para asociar el modelo de aplicación del motor Windows Communication Foundation (WCF) con los generadores de canales y las escuchas de canales. Sin esos enlaces, se requeriría programación en el nivel de canal para usar canales personalizados, tal y como se describe en Programación de servicios a nivel de canal y Programación de servicios a nivel de cliente. En este tema, se abordan los requisitos mínimos para permitir el uso de un canal en WCF, el desarrollo de un elemento BindingElement para ese canal y habilitar el uso desde la aplicación, tal y como se describe en el paso 4 del artículo Desarrollo de canales.
Información general
Si crea un elemento BindingElement para el canal, los desarrolladores podrán usarlo en una aplicación de WCF. Los objetos BindingElement se pueden usar desde la clase System.ServiceModel.ServiceHost para conectar una aplicación de WCF al canal sin necesidad de disponer de la información de tipo exacta del canal.
Una vez que haya creado un elemento BindingElement, podrá habilitar más funcionalidades en función de sus requisitos. Para ello, deberá seguir los pasos de desarrollo de canal restantes que se muestran en Desarrollo de canales.
Adición de un elemento de enlace
Para implementar un BindingElement personalizado, escriba una clase que se hereda desde BindingElement. Por ejemplo, si ha desarrollado un ChunkingChannel
que puede dividir los mensajes grandes en fragmentos y volverlos a ensamblar en el otro extremo, puede utilizar este canal en cualquier enlace implementando un BindingElement y configurando el enlace para utilizarlo. El resto de este tema utiliza ChunkingChannel
como un ejemplo para mostrar los requisitos para implementar un elemento de enlace.
ChunkingBindingElement
es el responsable de crear ChunkingChannelFactory
y ChunkingChannelListener
. Invalida las implementaciones CanBuildChannelFactory y CanBuildChannelListener y comprueba que el parámetro de tipo sea IDuplexSessionChannel (en nuestro ejemplo es la única forma del canal admitida por ChunkingChannel
), que los otros elementos del enlace admitan esta forma de canal.
BuildChannelFactory comprueba primero que la forma de canal solicitada pueda crearse y después obtiene una lista de acciones de mensaje que puedan fragmentarse. Después crea un nuevo ChunkingChannelFactory
al que se le pasa el generador de canales interno. (Si está creando un elemento de enlace de transporte, ese elemento será el último en la pila obligatoria y, por consiguiente, deberá crear un agente de escucha de canal o generador de canales.)
BuildChannelListener tiene una implementación similar para crear ChunkingChannelListener
y pasarle el agente de escucha de canal interno.
En otro ejemplo de uso de un canal de transporte, la muestra Transporte: UDP, se proporciona la invalidación que se muestra a continuación.
En el ejemplo, el elemento de enlace es UdpTransportBindingElement
, que deriva de TransportBindingElement. Invalida los métodos siguientes para crear los generadores asociados con el canal.
public IChannelFactory<TChannel> BuildChannelFactory<TChannel>(BindingContext context)
{
return (IChannelFactory<TChannel>)(object)new UdpChannelFactory(this, context);
}
public IChannelListener<TChannel> BuildChannelListener<TChannel>(BindingContext context)
{
return (IChannelListener<TChannel>)(object)new UdpChannelListener(this, context);
}
También contiene los miembros para clonar BindingElement
y devolver nuestro esquema (soap.udp).
Elementos de enlace de protocolo
Los nuevos elementos de enlace pueden reemplazar o aumentar cualquiera de los elementos de enlace incluidos, agregando nuevos transportes, codificaciones o protocolos de nivel más alto. Para crear un nuevo elemento de enlace de protocolo, comience extendiendo la clase BindingElement. Como mínimo, deberá implementar el método BindingElement.Clone y el objeto ChannelProtectionRequirements
mediante el método IChannel.GetProperty. Esto devuelve ChannelProtectionRequirements para este elemento de enlace. Para obtener más información, vea ChannelProtectionRequirements.
Clone debería devolver una copia nueva de este elemento de enlace. Como mejor procedimiento, recomendamos que los autores de los elementos de enlace implementen Clone mediante utilizando un constructor de copias que llama al constructor de copias base y, a continuación, clona cualquier campo adicional en esta clase.
Elementos de enlace de transporte
Para crear un nuevo elemento de transporte de enlace, extienda la interfaz TransportBindingElement. Como mínimo, deberá implementar el método Clone y la propiedad TransportBindingElement.Scheme.
Clone: debería devolver una copia nueva de este elemento de enlace. Como mejor procedimiento, recomendamos que los autores del elemento de enlace implementen el elemento de clonación por medio de un constructor de copias que llame al constructor de copias base y que después clone los campos adicionales en esta clase.
Scheme: la propiedad de obtención Scheme devuelve el esquema de URI para el protocolo de transporte representado por el elemento de enlace. Por ejemplo, en las clases System.ServiceModel.Channels.HttpTransportBindingElement y System.ServiceModel.Channels.TcpTransportBindingElement, se devuelve "http" y "net.tcp" desde sus propiedades Scheme respectivas.
Elementos de enlace de codificación
Para crear los nuevos elementos de enlace de codificación, comience extendiendo la clase BindingElement e implementando la clase System.ServiceModel.Channels.MessageEncodingBindingElement. Como mínimo, debe implementar los métodos Clone, MessageEncodingBindingElement.CreateMessageEncoderFactory y la propiedad MessageEncodingBindingElement.MessageVersion.
Clone. Devuelve una copia nueva de este elemento de enlace. Como mejor procedimiento, recomendamos que los autores de los elementos de enlace implementen Clone mediante utilizando un constructor de copias que llama al constructor de copias base y, a continuación, clona cualquier campo adicional en esta clase.
CreateMessageEncoderFactory. Devuelve MessageEncoderFactory, que proporciona un controlador a la clase real que implementa su nuevo codificador y cuál debería extender MessageEncoder. Para obtener más información, vea MessageEncoderFactory y MessageEncoder.
MessageVersion. Devuelve el MessageVersion utilizado en esta codificación, que representa las versiones de SOAP y WS-Addressing en uso.
Para una lista completa de métodos opcionales y propiedades para los elementos de enlace de codificación definidos por el usuario, vea MessageEncodingBindingElement.
Para obtener más información sobre el proceso de creación de un nuevo elemento de enlace, consulte Creación de enlaces definidos por el usuario.
Una vez que haya creado un elemento de enlace para el canal, vuelva al tema Desarrollo de canales para decidir si desea permitir que se admita el uso de archivos de configuración en el elemento de enlace, si desea permitir que se publiquen metadatos y cómo, y si desea construir un enlace definido por el usuario en el que se use su elemento de enlace y cómo.