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 esta sección se describe cómo usar la comunicación en cola en Windows Communication Foundation (WCF).
Las colas como enlace de transporte de WCF
En WCF, los contratos especifican lo que se intercambia. Los contratos son intercambios de mensajes dependientes de la empresa o específicos de aplicación. El mecanismo utilizado para intercambiar mensajes (o el "cómo") se especifica en las vinculaciones. Los enlaces en WCF encapsulan detalles del intercambio de mensajes. Exponen los botones de configuración para que el usuario controle varios aspectos del transporte o el protocolo que representan los enlaces. La puesta en cola en WCF se trata como cualquier otro enlace de transporte, lo que supone una gran ventaja para muchas aplicaciones de puesta en cola. Hoy en día, muchas aplicaciones de colas se escriben de manera diferente a otras aplicaciones de estilo distribuido de llamada a procedimiento remoto (RPC), lo que dificulta su seguimiento y mantenimiento. Con WCF, el estilo de escritura de una aplicación distribuida es muy similar, lo que facilita el seguimiento y el mantenimiento. Además, al factorizar el mecanismo de intercambio por separado de la lógica de negocios, es más fácil configurar el transporte o realizar cambios en él sin afectar al código específico de la aplicación. En la ilustración siguiente se muestra la estructura de un servicio WCF y un cliente utilizando MSMQ como medio de transporte.
Como puede ver en la ilustración anterior, el cliente y el servicio deben definir solo la semántica de la aplicación, es decir, el contrato y la implementación. El servicio configura una vinculación en cola con configuraciones preferidas. El cliente usa la Herramienta de utilidad de metadatos serviceModel (Svcutil.exe) para generar un cliente WCF al servicio y para generar un archivo de configuración que describa los enlaces que se usarán para enviar mensajes al servicio. De este modo, para enviar un mensaje en cola, el cliente crea instancias de un cliente WCF e invoca una operación en él. Esto hace que el mensaje se envíe a la cola de transmisión y se transfiera a la cola de destino. Todas las complejidades de la comunicación en cola están ocultas de la aplicación que envía y recibe mensajes.
Entre las advertencias acerca de los enlaces puestos en cola en WCF se incluyen las siguientes:
Todas las operaciones de servicio deben ser unidireccionales porque el enlace en cola predeterminado en WCF no admite la comunicación dúplex mediante colas. Un ejemplo de comunicación bidireccional (Comunicación bidireccional) muestra cómo utilizar dos contratos unidireccionales para implementar comunicación dúplex mediante colas.
Para generar un cliente WCF mediante el intercambio de metadatos, se requiere un punto de conexión HTTP adicional en el servicio para que se pueda consultar directamente para generar el cliente WCF y obtener información de enlace para configurar correctamente la comunicación en cola.
En función del enlace en cola, se requiere configuración adicional ajena a WCF. Por ejemplo, la clase NetMsmqBinding que se incluye con WCF requiere que configure los enlaces, así como que configure mínimamente la cola de mensajes (MSMQ).
En las secciones siguientes se describen los enlaces en cola específicos distribuidos con WCF, basados en MSMQ.
MSMQ
El transporte en cola en WCF utiliza MSMQ para su comunicación en cola.
MSMQ se distribuye como un componente opcional con Windows y se ejecuta como un servicio NT. Captura mensajes para la transmisión en una cola de transmisión y para la entrega en una cola de destino. Los administradores de colas de MSMQ implementan un protocolo de transferencia de mensajes confiable para que los mensajes no se pierdan en la transmisión. El protocolo puede ser nativo o basado en SOAP, como el Protocolo de mensajes confiables de SOAP (SRMP).
En MSMQ, las colas pueden ser transaccionales o no transaccionales. Una cola transaccional permite capturar y entregar mensajes en una transacción y luego almacenarlos de forma duradera en la cola. Los mensajes enviados a una cola transaccional se transfieren con precisión una vez en orden. Puede usar una cola no transaccional para enviar mensajes volátiles y duraderos. Un mensaje enviado a una cola no transaccional no tiene garantías de transferencia confiables; por lo tanto, los mensajes se pueden perder.
Las colas de MSMQ también se pueden proteger mediante una identidad de Windows registrada con el servicio de directorio de Active Directory. Al instalar MSMQ, puede instalar la integración de Active Directory, que requiere que el equipo forme parte de una red de dominio de Windows.
Para obtener más información sobre MSMQ, vea Instalación de Message Queue Server (MSMQ).
NetMsmqBinding
<netMsmqBinding> es la vinculación en cola que WCF proporciona para que dos puntos de conexión WCF se comuniquen mediante MSMQ. El enlace, por lo tanto, expone las propiedades específicas de MSMQ. Sin embargo, no todas las características y propiedades de MSMQ se exponen en el NetMsmqBinding. El compacto NetMsmqBinding está diseñado con un conjunto óptimo de características que la mayoría de los clientes deberían considerar suficientes.
NetMsmqBinding expone los conceptos fundamentales de las colas explicados hasta ahora como propiedades de los enlaces. Estas propiedades, a su vez, comunican a MSMQ cómo transferir y entregar los mensajes. Una explicación de las categorías de propiedades se encuentra en las secciones siguientes. Para obtener más información, vea los temas conceptuales que describen propiedades específicas más completamente.
ExactlyOnce y propiedades durables
Las ExactlyOnce propiedades y Durable afectan a cómo se transfieren los mensajes entre colas:
ExactlyOnce: cuando se establece entrue(valor predeterminado), el canal en cola garantiza que el mensaje, en caso de entrega, no se duplica. También garantiza que el mensaje no se pierda. Si no puede entregarse el mensaje, o expira el periodo de vida del mismo antes de poder entregarlo, tanto el mensaje fallido como la razón del error en la entrega se registran en una cola de componentes con problemas de entrega. Cuando se establece enfalse, el canal en espera intenta transferir el mensaje. En este caso, se puede optar por elegir una cola de mensajes no enviados.Durable:Cuando se establece entrue(valor predeterminado), el canal en cola garantiza que MSMQ almacena el mensaje de forma duradera en el disco. Por lo tanto, si el servicio MSMQ se detuviera y reiniciara, los mensajes en disco se transfieren a la cola de destino o se entregan al servicio. Cuando se establece enfalse, los mensajes se almacenan en el almacén volátil y se pierden al detener y luego reiniciar el servicio MSMQ.
MSMQ exige una cola transaccional para que la transferencia ExactlyOnce sea de confianza. Además, MSMQ exige que la transacción lea desde una cola transaccional. Por lo tanto, cuando se usa NetMsmqBinding, recuerde que se requiere una transacción para enviar o recibir mensajes cuando ExactlyOnce se establece en true. De igual forma, MSMQ exige a la cola que sea no transaccional para una mayor garantía, como cuando ExactlyOnce es false y en mensajería volátil. Así, al establecer ExactlyOnce en false o durable en false, no puede enviar o recibir mediante una transacción.
Nota:
Asegurarse de que la cola correcta (transaccional o no transaccional) se crea basándose en los valores de los enlaces. Si ExactlyOnce es true, use una cola transaccional; de lo contrario, use una cola no transaccional.
Propiedades de la cola de mensajes no enviados
La cola de mensajes no enviados se utiliza para guardar los mensajes cuya entrega ha sido fallida. El usuario puede escribir una lógica de compensación que expulse los mensajes fuera de la cola de mensajes no enviados.
Muchos sistemas de colas proporcionan una cola de mensajes no enviados para todo el sistema. MSMQ proporciona una cola de mensajes no enviados no transaccional para todo el sistema, para los mensajes con entrega fallida en colas no transaccionales; y una cola de mensajes no enviados transaccional para todo el sistema para los mensajes con entrega fallida en colas transaccionales.
Si varios clientes que envían mensajes a distintas colas de destino comparten el servicio MSMQ, todos los mensajes enviados por los clientes irán a la misma cola de mensajes no enviados. Esto no siempre es preferible. Para un mejor aislamiento, WCF y MSMQ en Windows Vista proporcionan una cola de mensajes no enviados personalizada (o cola de mensajes no enviados específica de la aplicación) que el usuario puede especificar para almacenar mensajes que no se entregan. Por lo tanto, los distintos clientes no comparten la misma cola de mensajes no enviados.
El enlace tiene dos propiedades interesantes:
DeadLetterQueue: esta propiedad es una enumeración que indica si se envía una solicitud a una cola de mensajes no enviados. La enumeración también contiene el tipo de cola de mensajes no enviados, en caso de que se solicite uno. Los valores sonNone,SystemyCustom. Para obtener más información sobre la interpretación de estas propiedades, consulte Uso de colas de Dead-Letter para controlar errores de transferencia de mensajes.CustomDeadLetterQueue: esta propiedad es la dirección del identificador uniforme de recursos (URI) de la cola de mensajes no enviados específica de la aplicación. Esto es necesario siDeadLetterQueue.Customse elige.
Propiedades de control de mensajes dudosos
Cuando el servicio lee los mensajes de la cola de destino en una transacción, el servicio puede no procesar el mensaje por varias razones. A continuación, el mensaje se vuelve a colocar en la cola para que se vuelva a leer. Para gestionar los mensajes en los que se producen errores repetidamente, se puede configurar un conjunto propiedades de control de mensajes dudosos en el enlace. Hay cuatro propiedades: ReceiveRetryCount, MaxRetryCycles, RetryCycleDelayy ReceiveErrorHandling. Para obtener más información sobre estas propiedades, vea Control de mensajes dudosos.
Propiedades de seguridad
MSMQ expone su propio modelo de seguridad, como listas de control de acceso (ACL) en una cola o enviando mensajes autenticados.
NetMsmqBinding expone estas propiedades de seguridad como parte de su configuración de seguridad de transporte. Hay dos propiedades en el enlace para la seguridad de transporte: MsmqAuthenticationMode y MsmqProtectionLevel. Las opciones de estas propiedades dependen de cómo se configura MSMQ. Para obtener más información, consulte Protección de mensajes mediante seguridad de transporte.
Además de la seguridad de transporte, el propio mensaje SOAP se puede proteger mediante la seguridad del mensaje. Para obtener más información, consulte Protección de mensajes mediante la seguridad de mensajes.
MsmqTransportSecurity también expone dos propiedades, MsmqEncryptionAlgorithm y MsmqHashAlgorithm. Éstas son enumeraciones de distintos algoritmos que permiten elegir el cifrado de la transferencia cola a cola de mensajes y el algoritmo hash de las firmas.
Otras propiedades
Además de las propiedades anteriores, otras propiedades específicas de MSMQ expuestas en la vinculación incluyen:
UseSourceJournal: una propiedad que indica la activación del registro en el diario de origen. El registro en el diario de origen es una característica de MSMQ que hace un seguimiento de los mensajes transmitidos correctamente desde la cola de transmisión.UseMsmqTracing: propiedad para indicar que el seguimiento de MSMQ está activado. El seguimiento de la traza de MSMQ envía mensajes de informe a una cola de informes cada vez que un mensaje sale o llega a un equipo en el que se aloja un administrador de cola de MSMQ.QueueTransferProtocol: una enumeración del protocolo utilizado para las transferencias de mensajes cola a cola. MSMQ implementa un protocolo nativo de transferencia de cola a cola y un protocolo basado en SOAP denominado Protocolo de Mensajería Confiable SOAP (SRMP). Se utiliza SRMP cuando se recurre al transporte HTTP para las transferencias cola a cola. La protección SRMP se utiliza cuando se recurre a HTTPS para las transferencias cola a cola.UseActiveDirectory: valor booleano para indicar si se debe usar Active Directory para la resolución de direcciones de cola. De forma predeterminada, esto está desactivado. Para obtener más información, consulte Puntos de conexión de servicio y Direccionamiento de colas.
MsmqIntegrationBinding
MsmqIntegrationBinding se usa cuando desea que un punto de conexión WCF se comunique con una aplicación MSMQ existente escrita en las API de C, C++, COM o System.Messaging.
Las propiedades de enlace son las mismas que para NetMsmqBinding. Sin embargo, se aplican las siguientes diferencias:
El contrato de operación para
MsmqIntegrationBindingestá restringido a tomar un único parámetro de tipo MsmqMessage<T>, donde el parámetro de tipo es el tipo de cuerpo.Gran parte de las propiedades nativas de mensajes de MSMQ se exponen en MsmqMessage<T> para su uso.
Para ayudar con la serialización y deserialización del cuerpo del mensaje, se proporcionan serializadores como XML y ActiveX.
Código de ejemplo
Para obtener instrucciones paso a paso sobre cómo escribir servicios WCF que usan MSMQ, consulte los temas siguientes:
Para ver un ejemplo de código completado que ilustra el uso de MSMQ en WCF, consulte los temas siguientes: