Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este tema se describe cómo crear codificadores personalizados.
En Windows Communication Foundation (WCF), se usa un enlace para especificar cómo transferir datos a través de una red entre puntos de conexión. 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 mensajes se representa mediante un elemento de enlace de codificación de mensajes. En WCF se incluyen 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 una salida Message y la pasa al transporte, o recibe la forma serializada de un mensaje del transporte y la pasa a la capa de protocolo si está presente o a la aplicación, si no está presente.
Los codificadores del mensaje transforman las instancias Message a y desde una representación de la conexión. Aunque los codificadores se describen como colocados sobre la capa de transporte en la estructura del canal, residen dentro de la capa de transporte. Los transportes (por ejemplo, HTTP) formatean el mensaje según los requisitos del estándar de transporte. Los codificadores (por ejemplo, Text Xml) simplemente codifican el mensaje.
Al conectarse a un cliente o servidor preexistente, es posible que no tenga la opción de usar una codificación de mensajes determinada. Sin embargo, los servicios WCF se pueden hacer accesibles a través de varios puntos de conexión, cada uno con un codificador de mensajes diferente. Cuando un único codificador no cubre toda la audiencia del servicio, considere la posibilidad de exponer el servicio a través de varios puntos de conexión. Después, las aplicaciones cliente pueden elegir el punto de conexión que es mejor para ellas. El uso de varios puntos de conexión permite combinar las ventajas de diferentes codificadores de mensajes con otros elementos de enlace.
codificadores de System-Provided
WCF proporciona varios enlaces proporcionados por el sistema diseñados para cubrir los escenarios de aplicación más comunes. Cada uno de estos enlaces combina un transporte, un codificador de mensajes y otras opciones (seguridad, por ejemplo). 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 una codificación XML sin formato como codificaciones SOAP. El modo de codificación XML sin formato del codificador de mensajes de texto se denomina codificador POX ("XML antiguo sin formato") para distinguirlo de la codificación SOAP basada en texto.
Para obtener más información sobre las combinaciones de elementos de enlace proporcionados por el sistema, vea la sección correspondiente en Elegir un transporte.
Cómo trabajar con codificadores de System-Provided
Se agrega una codificación a un enlace mediante una clase derivada de MessageEncodingBindingElement.
WCF proporciona los siguientes tipos de elementos de enlace derivados de la clase MessageEncodingBindingElement que pueden proporcionar codificación de texto, binario y el mecanismo de optimización de transmisión de mensajes (MTOM).
TextMessageEncodingBindingElement: el codificador más interoperable, pero el menos eficaz para los mensajes XML. Por lo general, un servicio web o cliente de servicio web puede comprender XML textual. Sin embargo, transmitir bloques grandes de datos binarios como texto no es eficiente.
BinaryMessageEncodingBindingElement: representa el elemento de enlace que especifica la codificación de caracteres y el control de versiones de mensajes usados para los mensajes XML basados en binarios. Esto es más eficaz de las opciones de codificación, pero la menos interoperable, ya que solo es compatible con los puntos de conexión wcF.
MtomMessageEncodingBindingElement: representa el elemento de enlace que especifica la codificación de caracteres y el control de versiones de mensajes usados para un mensaje mediante una codificación del Mecanismo de optimización de transmisión de mensajes (MTOM). MTOM es una tecnología eficaz para transmitir datos binarios en mensajes WCF. El codificador MTOM intenta equilibrar la eficacia y la interoperabilidad. La codificación MTOM transmite la mayoría de xml en formato textual, pero optimiza grandes bloques de datos binarios transmitiéndolos as-is, sin conversión al texto.
El elemento de enlace crea un archivo binario, MTOM o texto MessageEncoderFactory. El generador crea una instancia binaria, MTOM o de texto MessageEncoderFactory . Normalmente, solo hay una sola instancia. Sin embargo, si se usan sesiones, se puede proporcionar un codificador diferente a cada sesión. El codificador binario hace uso de esto para coordinar diccionarios dinámicos (vea Infraestructura XML).
Los ReadMessage métodos y WriteMessage son el núcleo de los codificadores. Los métodos permiten leer un mensaje de una secuencia o de una Byte matriz. 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 un búfer, proporciona un flujo que realiza este almacenamiento.
El resto del trabajo de los miembros que admiten contenido, tipos de medio y MessageVersion. El transporte llama a estos métodos de codificador para probar si el mensaje entrante puede descodificarlo 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 es totalmente configurable. Los codificadores también exponen cuotas de lector con valores predeterminados seguros. Consulte Infraestructura XML para obtener una explicación de las cuotas.
Características de codificadores de System-Provided
Hay una serie de características proporcionadas por los codificadores proporcionados por el sistema.
Agrupación
Cada una de las implementaciones del codificador intenta agrupar el máximo posible. Reducir las asignaciones es una manera clave de mejorar el rendimiento del código administrado. Para lograr esta agrupación, las implementaciones usan la SynchronizedPool clase . El archivo de C# contiene una descripción de las optimizaciones adicionales que usa esta clase.
Las instancias XmlDictionaryReader y 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 estado de mensaje usados al construir mensajes. Los tamaños de estos grupos se pueden configurar mediante las propiedades MaxReadPoolSize y MaxWritePoolSize en cada una de las tres clases derivadas de MessageEncodingBindingElement.
Codificación binaria
Cuando la codificación binaria usa sesiones, la cadena de diccionario dinámico debe comunicarse al receptor del mensaje. Esto se hace mediante el prefijo del mensaje con las cadenas de diccionario dinámico. 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.
Un método interno AddSessionInformationToMessage anexa las cadenas al mensaje. Agrega cadenas en forma de UTF-8 al principio del mensaje, siendo precedidas por su longitud. A continuación, se prefija el encabezado de diccionario completo con la longitud de sus datos. La operación inversa se realiza mediante un método interno ExtractSessionInformationFromMessage .
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 usa la clase interna MessagePatterns para deconstruir la secuencia binaria. La idea es que la mayoría de los mensajes tienen un determinado conjunto de encabezados que aparecen en un orden determinado cuando se generan mediante WCF. El sistema de patrones descompone el mensaje en función de lo que prevé. Si se ejecuta correctamente, inicializa un MessageHeaders objeto sin analizar el XML. Si no es así, vuelve al método estándar.
Codificación MTOM
La MtomMessageEncodingBindingElement clase tiene una propiedad de configuración adicional denominada MaxBufferSize. Esto coloca un límite superior en la cantidad de datos que se permite almacenar en búfer durante el proceso de lectura de un mensaje. Es posible 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 único mensaje.
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. Debe producirse más comunicación para asegurarse de que los valores de los encabezados HTTP están de acuerdo con los valores de los encabezados MIME.
Internamente, el codificador de mensajes MTOM usa lectores de texto de WCF y es similar al codificador Text. La principal diferencia es que optimiza fragmentos grandes de objetos binarios o "Objetos grandes binarios" (BLOB), sin convertirlos en codificación Base 64 antes de incrustarse en los bytes del mensaje. En su lugar, estos BLOB se mantienen extraídos y se les hace referencia como datos adjuntos de MIME.
Escribir su propio codificador
Para implementar su propio codificador de mensajes personalizado, debe proporcionar implementaciones personalizadas de las siguientes clases base abstractas:
La conversión de la representación en memoria de un mensaje a una representación que se puede escribir en una secuencia se encapsula dentro de la clase MessageEncoder, que actúa como fábrica para lectores XML y escritores XML que admiten tipos específicos de codificaciones XML.
Los métodos clave de esta clase que debe invalidar son:
WriteMessage que adopta un objeto MessageEncodingBindingElement y lo escribe en un objeto Stream.
ReadMessage que adopta un objeto Stream y un tamaño de encabezado máximo, y devuelve un objeto Message.
Es el código que escribe en estos métodos que controla la conversión entre el protocolo de transporte estándar y la codificación personalizada.
A continuación, debe codificar una clase de fábrica 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.
Hay dos ejemplos proporcionados con WCF que ilustran este proceso con código de ejemplo: Codificador de mensajes personalizados: Codificador de texto personalizado y Codificador de mensajes personalizados: Codificador de compresión.