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 artículo se describen los criterios para elegir entre los codificadores de mensajes que se incluyen en Windows Communication Foundation (WCF): binario, texto y mecanismo de optimización de transmisión de mensajes (MTOM).
En WCF, se especifica cómo transferir datos a través de una red entre puntos de conexión mediante un enlace, que se compone de una secuencia de elementos de enlace. Un codificador de mensajes se representa mediante un elemento de enlace de codificación de mensajes en la pila de enlaces. Un enlace incluye elementos de enlace de protocolo opcionales, como un elemento de enlace de seguridad o un elemento de enlace de mensajería confiable, un elemento de enlace de codificación de mensajes necesario y un elemento de enlace de transporte necesario.
El elemento de enlace de codificación de mensajes se encuentra debajo de los elementos de enlace de protocolo opcionales y encima del elemento de enlace de transporte necesario. En el lado de salida, un codificador de mensajes serializa los Message de salida y los pasa al transporte. En el lado entrante, un codificador de mensajes recibe la forma serializada de un Message del transporte y la pasa a la capa de protocolo superior, si está presente, o a la aplicación, si no.
Al conectarse a un cliente o servidor preexistente, es posible que no tenga la opción de usar una codificación de mensajes determinada, ya que necesita codificar los mensajes de una manera que el otro lado espera. Sin embargo, si está escribiendo un servicio WCF, puede exponer el servicio a través de varios puntos de conexión, cada uno mediante una codificación de mensajes diferente. Esto permite a los clientes elegir la mejor codificación para comunicarse con su servicio a través del punto de conexión que es mejor para ellos, así como proporcionar a sus clientes la flexibilidad de elegir la codificación que es mejor para ellos. El uso de varios puntos de conexión también permite combinar las ventajas de diferentes codificaciones de mensajes con otros elementos de enlace.
codificadores de System-Provided
WCF incluye tres codificadores de mensajes, que se representan mediante las tres clases siguientes:
TextMessageEncodingBindingElement, el codificador de mensajes de texto, admite codificación XML sin formato y codificación SOAP. El modo de codificación XML sin formato del codificador de mensajes de texto se denomina "XML antiguo sin formato" (POX) para distinguirlo de la codificación SOAP basada en texto. Para habilitar POX, establezca la propiedad MessageVersion en None. Use el codificador de mensajes de texto para interoperar con puntos de conexión que no son WCF.
BinaryMessageEncodingBindingElement, el codificador de mensajes binarios, usa un formato binario compacto y está optimizado para la comunicación WCF a WCF y, por tanto, no es interoperable. Este es también el codificador más eficaz de todos los codificadores WCF que proporciona.
MtomMessageEncodingBindingElement, el elemento de enlace, especifica la codificación de caracteres y el control de versiones de mensajes para los mensajes mediante la codificación MTOM. MTOM es una tecnología eficaz para transmitir datos binarios en mensajes WCF. El codificador MTOM intenta crear un equilibrio entre 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. En términos de eficiencia, entre los codificadores WCF proporciona, MTOM está entre texto (el más lento) y binario (el más rápido).
Cómo elegir un codificador de mensajes
En la tabla siguiente se describen los factores comunes que se usan para elegir un codificador de mensajes. Priorice los factores que son importantes para la aplicación y, a continuación, elija los codificadores de mensajes que mejor funcionan con estos factores. Asegúrese de tener en cuenta los factores adicionales que no aparecen en esta tabla y los codificadores de mensajes personalizados que puedan ser necesarios en la aplicación.
Factor | Descripción | Codificadores que admiten este factor |
---|---|---|
Juegos de caracteres compatibles | TextMessageEncodingBindingElement y MtomMessageEncodingBindingElement solo admiten las codificaciones Unicode (big-endian y little-endian) UTF8 y UTF16. Si se requieren otras codificaciones, como UTF7 o ASCII, se debe usar un codificador personalizado. Para obtener un codificador personalizado de ejemplo, consulte Custom Message Encoder( Codificador de mensajes personalizados). | Mensaje de texto |
Inspección | La inspección es la capacidad de examinar los mensajes durante la transmisión. Las codificaciones de texto, ya sea con o sin el uso de SOAP, permiten inspeccionar y analizar mensajes mediante muchas aplicaciones sin el uso de herramientas especializadas. El uso de la seguridad de transferencia, en el nivel de mensaje o transporte, afecta a la capacidad de inspeccionar los mensajes. La confidencialidad protege un mensaje de ser examinado e integridad protege un mensaje de modificación. | Mensaje de texto |
Fiabilidad | La confiabilidad es la resistencia de un codificador a errores de transmisión. También se puede proporcionar confiabilidad en el mensaje, transporte o capa de aplicación. Todos los codificadores WCF estándar asumen que otra capa proporciona confiabilidad. El codificador tiene poca capacidad para recuperarse de un error de transmisión. | Ninguno |
Simplicidad | La simplicidad representa la facilidad con la que puede crear codificadores y descodificadores para una especificación de codificación. Las codificaciones de texto son especialmente ventajosas por su simplicidad, y la codificación de texto POX tiene la ventaja adicional de no requerir soporte para el procesamiento de SOAP. | Texto (POX) |
Tamaño | La codificación determina la cantidad de sobrecarga impuesta al contenido. El tamaño de los mensajes codificados está directamente relacionado con el rendimiento máximo de las operaciones de servicio. Las codificaciones binarias suelen ser más compactas que las codificaciones de texto. Cuando el tamaño del mensaje es crucial, considere también comprimir el contenido del mensaje durante la codificación. Sin embargo, la compresión agrega costos de procesamiento para el remitente del mensaje y el receptor. | Binario |
Transmisión en línea | El streaming permite a las aplicaciones comenzar a procesar un mensaje antes de que haya llegado todo el mensaje. El uso eficaz del streaming requiere que los datos importantes de un mensaje estén disponibles al principio del mensaje para que la aplicación receptora no sea necesaria para esperar a que llegue. Además, las aplicaciones que usan la transferencia transmitida deben organizar los datos en el mensaje de forma incremental para que el contenido no tenga dependencias reenviadas. En muchos casos, debe hacer concesiones entre el contenido de streaming y tener el tamaño de transferencia más pequeño posible para ese contenido. | Ninguno |
Compatibilidad con herramientas de terceros | Entre las áreas de soporte técnico para una codificación se incluyen el desarrollo y el diagnóstico. Los desarrolladores de terceros han realizado una gran inversión en bibliotecas y kits de herramientas para controlar los mensajes codificados en el formato POX. | Texto (POX) |
Interoperabilidad | Este factor hace referencia a la capacidad de un codificador WCF para interoperar con servicios que no son WCF. | Mensaje de texto MTOM (parcial) |
Nota: Al usar el codificador binario, el uso de la configuración IgnoreWhitespace al crear un XMLReader no tendrá ningún efecto. Por ejemplo, si hace lo siguiente dentro de una operación de servicio:
public void OperationContract(XElement input)
{
Console.WriteLine("{0}", input.Value);
int counter = 0;
var xreader = input.CreateReader();
var reader = XmlReader.Create(xreader, new XmlReaderSettings() { IgnoreWhitespace = true });
while (reader.Read())
{
counter++;
}
Console.WriteLine("Read {0} lines with reader", counter);
}
Se omite la configuración IgnoreWhitespace.
Compresión y codificador binario
A partir de WCF 4.5, el codificador binario WCF agrega compatibilidad con la compresión. Esto le permite usar el algoritmo gzip/deflate para enviar mensajes comprimidos desde un cliente WCF y también responder con mensajes comprimidos de un servicio WCF autohospedado. Esta característica habilita la compresión en los transportes HTTP y TCP. Un servicio WCF hospedado en IIS siempre se puede habilitar para enviar respuestas comprimidas mediante la configuración del servidor host de IIS. El tipo de compresión se configura con la BinaryMessageEncodingBindingElement.CompressionFormat propiedad . Esta propiedad se establece en uno de los valores de la enumeración System.ServiceModel.Channels.CompressionFormat:
Dado que esta propiedad solo se expone en binaryMessageEncodingBindingElement, deberá crear un enlace personalizado como el siguiente para usar esta característica:
<customBinding>
<binding name="BinaryCompressionBinding">
<binaryMessageEncoding compressionFormat ="GZip" />
<httpTransport />
</binding>
</customBinding>
Tanto el cliente como el servicio deben aceptar enviar y recibir mensajes comprimidos y, por tanto, la propiedad compressionFormat debe configurarse en el elemento binaryMessageEncoding tanto en el cliente como en el servicio. Se produce una excepción ProtocolException si el servicio o el cliente no está configurado para la compresión, pero el otro lado sí lo está. La habilitación de la compresión debe tenerse en cuenta. La compresión es principalmente útil si el ancho de banda de red es un cuello de botella. En el caso de que la CPU sea el cuello de botella, la compresión reducirá el rendimiento. Las pruebas adecuadas deben realizarse en un entorno simulado para averiguar si esto beneficia a la aplicación.