Codificadores personalizados

Este tema describe cómo crear codificadores personalizados.

En Windows Communication Foundation (WCF), se usa un enlace para especificar cómo transferir los datos entre los puntos de conexión de una red. Un enlace se compone de una secuencia de elementos de enlace. Un enlace incluye elementos de enlace de protocolo opcionales, como seguridad, un elemento de enlace codificador de mensajes necesario y un elemento de enlace de transporte necesario. Un codificador de mensaje está representado por un elemento de enlace de codificación de mensaje. WCF incluye tres codificadores de mensajes: binario, mecanismo de optimización de transmisión de mensajes (MTOM) y texto.

Un elemento de enlace de codificación de mensajes serializa un Message saliente y lo pasa al transporte, o recibe del transporte la forma serializada de un mensaje y lo pasa al nivel de protocolo, si está presente, o, si no lo está, a la aplicación.

Los codificadores del mensaje transforman las instancias Message a y desde una representación de la conexión. Aunque los codificadores se describen como situados encima del nivel de transporte en la pila del canal, en realidad residen en el nivel de transporte. Los transportes (por ejemplo HTTP) dan formato al mensaje según los requisitos de la norma de transporte. Los codificadores (por ejemplo texto/Xml) apenas codifican el mensaje.

Al establecer una conexión con un cliente o servidor existente previamente, puede tener opciones sobre la utilización de una codificación de mensajes determinada. Sin embargo, los servicios WCF pueden hacerse accesibles a través de varios puntos de conexión, cada uno con un codificador de mensajes diferente. Cuando un único codificador no abarca toda la audiencia de su servicio, considere la exposición del servicio en varios extremos. De este modo, las aplicaciones cliente pueden elegir el extremo que más les convenga. La utilización de múltiples extremos permite combinar las ventajas de diferentes codificadores de mensaje con otros elementos de enlace.

Codificadores proporcionados por el sistema

WCF ofrece varios enlaces proporcionados por el sistema diseñados para abarcar los escenarios de aplicaciones más habituales. Cada uno de estos enlaces combina un transporte, un codificador de mensaje y otras opciones (por ejemplo, seguridad). En este tema se describe cómo extender los codificadores de mensajes Text, Binary y MTOM incluidos en WCF, o cómo crear su propio codificador personalizado. El codificador de mensajes de texto admite tanto la codificación XML como la codificación SOAP. El modo de codificación XML sin formato del codificador de mensajes de texto se denomina POX (“XML sin formato"), para distinguirlo de la codificación SOAP basada en texto.

Para más información sobre las combinaciones de elementos de enlace suministrados por los enlaces proporcionados por el sistema, consulte la sección correspondiente en Selección de un transporte.

Cómo trabajar con codificadores proporcionados por el sistema

Se agrega una codificación a un enlace mediante una clase derivada de MessageEncodingBindingElement.

WCF ofrece los siguientes tipos de elementos de enlace derivados de la clase MessageEncodingBindingElement que se pueden proporcionar para la codificación de texto, binaria y del mecanismo de optimización de transmisión de mensajes (MTOM):

  • TextMessageEncodingBindingElement: el codificador más interoperable, pero el menos eficaz con mensajes XML. En general, un servicio web, o un cliente de servicios web, pueden entender XML textual. No obstante, la transmisión de grandes bloques de datos binarios en forma de texto no es eficaz.

  • BinaryMessageEncodingBindingElement: representa el elemento de enlace que especifica la codificación de caracteres y el control de versiones del mensaje, utilizados con los mensajes binarios basados en XML. Esta es la opción de codificación más eficaz, aunque la menos interoperable, debido a que solo es compatible con los puntos de conexión de WCF.

  • MtomMessageEncodingBindingElement: representa el elemento de enlace que especifica la codificación de caracteres y el control de versiones del mensaje, utilizados con un mensaje codificado mediante el mecanismo de optimización de la transmisión del mensaje (MTOM). MTOM es una tecnología eficaz para la transmisión de datos binarios en mensajes de WCF. El codificador MTOM intenta equilibrar la eficacia y la interoperabilidad. El codificador MTOM transmite la mayoría del XML en formato de texto, pero optimiza bloques grandes de datos binarios transmitiéndolos como son, sin convertirlos en texto.

El elemento de enlace crea un binario, MTOM, o MessageEncoderFactory de texto. El generador crea un binario, MTOM o una instancia MessageEncoderFactory de texto. Normalmente, solo existe una instancia. No obstante, si se utilizan sesiones, puede proporcionarse un codificador diferente para cada sesión. El codificador binario utiliza este recurso para coordinar los diccionarios dinámicos (vea, Infrastructura de XML).

Los métodos ReadMessage y WriteMessage constituyen el núcleo de los codificadores. Los métodos proporcionan la lectura de un mensaje desde una secuencia o desde una matriz Byte. Las matrices de bytes se utilizan cuando el transporte está operando en modo de almacenamiento en búfer. Los mensajes siempre se escriben en secuencias. Si el transporte debe almacenar el mensaje en búfer, proporciona una secuencia que realiza el almacenamiento en búfer.

El resto del trabajo de los miembros que admiten contenido, tipos de medio y MessageVersion. El transporte llama a estos métodos de codificación para probar si puede descodificar el mensaje entrante, o determinar si el mensaje saliente es válido para este codificador.

Cada una de las tres implementaciones del codificador agrega propiedades que son relevantes para las codificaciones específicas y que son totalmente configurables. Los codificadores también exponen cuotas de lector con valores predeterminados seguros. Vea Infrastructura de XML para obtener una descripción de las cuotas.

Características de los codificadores proporcionados por el sistema

Los codificadores proporcionados por sistema ofrecen diferentes características.

Agrupación

Cada una de las implementaciones del codificador intenta agrupar el máximo posible. La reducción de las asignaciones es una manera clave de mejorar el rendimiento del código administrado. Para lograr esta agrupación, las implementaciones utilizan la clase SynchronizedPool. El archivo C# contiene una descripción de las optimizaciones adicionales utilizadas por esta clase.

XmlDictionaryReader y las instancias XmlDictionaryWriter se agrupan y reinicializan para evitar la asignación de otras nuevas para cada mensaje. Para los lectores, una devolución de llamada OnClose reclama al lector cuando se llama a Close(). El codificador también recicla algunos objetos de estados del mensaje utilizados al construir los mensajes. Los tamaños de estos grupos pueden configurarse mediante MaxReadPoolSize y las propiedades MaxWritePoolSize, en cada una de las tres clases derivadas de MessageEncodingBindingElement.

Codificación binaria

Cuando la codificación binaria utiliza sesiones, la cadena del diccionario dinámico debe comunicarse con el receptor del mensaje. Para ello, las cadenas del diccionario dinámico se incluyen como prefijo del mensaje. El receptor quita las cadenas, las agrega a la sesión, y procesa el mensaje. Para pasar correctamente las cadenas del diccionario es necesario que el transporte se almacene en búfer.

Las cadenas se anexan al mensaje mediante un método AddSessionInformationToMessage interno. Agrega las cadenas con formato UTF-8 al principio del mensaje prefijado con su longitud. A continuación, se prefija el encabezado de diccionario completo con la longitud de sus datos. La operación inversa la realiza un método ExtractSessionInformationFromMessage interno.

Además de procesar las claves de diccionario dinámico, los mensajes con sesión almacenados en búfer se reciben de una única manera. En lugar de crear un lector sobre el documento y procesarlo, el codificador binario utiliza la clase MessagePatterns interna para deconstruir la secuencia binaria. La idea es que la mayoría de los mensajes tiene un determinado conjunto de encabezados que se muestran en un orden determinado si se han generado mediante WCF. El sistema del patrón interrumpe el mensaje basándose en sus expectativas. Si es correcto, inicializa un objeto MessageHeaders sin analizar el XML. Si no lo es, recurre al método estándar.

Codificación MTOM

La clase MtomMessageEncodingBindingElement tiene una propiedad de configuración adicional denominada MaxBufferSize. Esta propiedad establece un límite superior a la cantidad de datos que pueden almacenarse en búfer durante el proceso de lectura de un mensaje. Puede que sea necesario almacenar en búfer el conjunto de información XML (Infoset), u otras partes MIME, para volver a ensamblar todas las partes MIME en un mensaje único.

Para trabajar correctamente con HTTP, la clase interna del codificador de mensajes de MTOM proporciona algunas API internas para GetContentType, qué también es interno, y WriteMessage, que es público y puede invalidarse. Puede producirse una mayor comunicación para garantizar que los valores de los encabezados HTTP coinciden con los valores de los encabezados MIME.

Internamente, el codificador de mensajes de MTOM usa lectores de texto de WCF, y es similar al codificador de texto. La diferencia principal es que optimiza grandes fragmentos de datos binarios, o BLOB (grandes objetos binarios), sin convertirlos a la codificación Base 64 antes de incrustarlos en los bytes del mensaje. En su lugar, estos BLOB se mantienen extraídos y se les hace referencia como datos adjuntos de MIME.

Escritura de los propios controles

Para implementar su propio codificador de mensajes personalizado, debe proporcionar implementaciones personalizadas de las siguientes tres clases base abstractas:

La conversión de la representación en memoria de un mensaje a una representación que pueda escribirse en una secuencia, se encapsula en la clase MessageEncoder, que actúa como generador para los lectores y sistemas de escritura XML que admiten tipos específicos de codificación XML.

Es el código que se escribe en los métodos que administran la conversión entre el protocolo de transporte estándar y su codificación personalizada.

A continuación, es necesario programar una clase de generador que cree el codificador personalizado. Invalide Encoder para devolver una instancia de su MessageEncoder personalizado.

A continuación, conecte su MessageEncoderFactory personalizado a la pila de elementos de enlace utilizada para configurar el servicio o el cliente, invalidando el método CreateMessageEncoderFactory, para devolver una instancia de este generador.

Se proporcionan dos ejemplos de código con WCF que ilustran este proceso: Codificador de mensajes personalizado: Codificador de texto personalizado y Codificador de mensajes personalizado: Codificador de compresión.

Consulte también