Compartir a través de


Creación de un BindingElement

Los enlaces y elementos de enlace (los objetos que extienden System.ServiceModel.Channels.Binding y System.ServiceModel.Channels.BindingElement, respectivamente) son el lugar donde el modelo de aplicación de Windows Communication Foundation (WCF) está asociado a generadores de canales y agentes de escucha de canal. Sin los enlaces, usar los canales personalizados requiere programación en el nivel de canal tal y como se describe en Programación de servicios a nivel de canal y Programación a nivel de canal de cliente. Este tema trata sobre el requisito mínimo para permitir usar el canal en WCF, el desarrollo de BindingElement para su canal y habilitar el uso desde la aplicación tal y como se describe en el paso 4 de Desarrollo de canales.

Información general

La creación de un BindingElement para el canal permite a los desarrolladores utilizarlo en una aplicación WCF. Se pueden usar los objetos BindingElement a partir de la clase System.ServiceModel.ServiceHost para conectar una aplicación WCF a su canal sin tener la información de tipo precisa del canal.

Una vez que se haya creado BindingElement, puede permitir más funcionalidad según sus requisitos siguiendo los pasos de desarrollo de canal restantes descritos 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.

Si desea ver otro ejemplo de uso del canal de transporte, la muestra de Transporte: UDP proporciona la invalidación siguiente.

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, debe implementar System.ServiceModel.Channels.BindingElement.Clone y ChannelProtectionRequirements mediante System.ServiceModel.Channels.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 procedimiento recomendado, recomendamos que los autores del elemento de enlace implementen Clone utilizando un constructor de copias que llama al constructor de copias base, 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 System.ServiceModel.Channels.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, System.ServiceModel.Channels.HttpTransportBindingElement y System.ServiceModel.Channels.TcpTransportBindingElement devuelven "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, System.ServiceModel.Channels.MessageEncodingBindingElement.CreateMessageEncoderFactory y la propiedad System.ServiceModel.Channels.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 cómo crear un nuevo elemento de enlace, vea Creación de enlaces definidos por el usuario.

Cuando haya creado un elemento de enlace para el canal, vuelva al tema Desarrollo de canales para ver si desea agregar la compatibilidad del archivo de configuración a su elemento de enlace, si agregar la compatibilidad de publicación de metadatos y cómo, y si construir un enlace definido por el usuario que utiliza su elemento de enlace y cómo.

Vea también

Tareas

Transporte: UDP

Referencia

BindingElement

Conceptos

Desarrollo de canales