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.
El ejemplo MsmqToWcf muestra cómo una aplicación Message Queuing (MSMQ) puede enviar un mensaje MSMQ a un servicio de Windows Communication Foundation (WCF). El servicio es una aplicación de consola autohospedada que le permite observar el servicio que recibe los mensajes en cola.
El contrato de servicio es IOrderProcessor
, que define un servicio unidireccional adecuado para su uso con colas. Un mensaje MSMQ no tiene un encabezado Action, por lo que no es posible asignar mensajes MSMQ diferentes a contratos de operación automáticamente. Por lo tanto, solo puede haber un contrato de operación. Si desea definir más de un contrato de operación para el servicio, la aplicación debe proporcionar información sobre qué encabezado del mensaje MSMQ (por ejemplo, la etiqueta o correlationID) se puede usar para decidir qué contrato de operación se va a enviar.
El mensaje MSMQ no contiene información sobre los encabezados que se asignan a los distintos parámetros del contrato de operación. El parámetro es de tipo MsmqMessage<T>(MsmqMessage<T>
), que contiene el mensaje MSMQ subyacente. El tipo "T" de la MsmqMessage<T>clase (MsmqMessage<T>
) representa los datos que se serializan en el cuerpo del mensaje MSMQ. En este ejemplo, el tipo PurchaseOrder
se serializa en el cuerpo del mensaje MSMQ.
El código de ejemplo siguiente muestra el contrato de servicio del servicio de procesamiento de pedidos.
// Define a service contract.
[ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")]
[ServiceKnownType(typeof(PurchaseOrder))]
public interface IOrderProcessor
{
[OperationContract(IsOneWay = true, Action = "*")]
void SubmitPurchaseOrder(MsmqMessage<PurchaseOrder> msg);
}
El servicio se hospeda en sí mismo. Al utilizar MSMQ, la cola usada debe crearse de antemano. Esto se puede hacer manualmente o a través del código. En este ejemplo, el servicio comprueba la existencia de la cola y lo crea si es necesario. El nombre de la cola se lee del archivo de configuración.
public static void Main()
{
// Get the MSMQ queue name from the application settings in
// configuration.
string queueName = ConfigurationManager.AppSettings["queueName"];
// Create the MSMQ queue if necessary.
if (!MessageQueue.Exists(queueName))
MessageQueue.Create(queueName, true);
…
}
El servicio crea y abre un ServiceHost para el OrderProcessorService
, como se muestra en el siguiente código de ejemplo.
using (ServiceHost serviceHost = new ServiceHost(typeof(OrderProcessorService)))
{
serviceHost.Open();
Console.WriteLine("The service is ready.");
Console.WriteLine("Press <ENTER> to terminate service.");
Console.ReadLine();
serviceHost.Close();
}
El nombre de la cola MSMQ se especifica en la sección 'appSettings' del archivo de configuración, como se muestra en la siguiente configuración de ejemplo.
Nota:
El nombre de la cola utiliza un punto (.) para el equipo local y separadores con barra diagonal inversa en su ruta de acceso. La dirección del punto de conexión de WCF especifica un esquema msmq.formatname y usa localhost para el equipo local. La dirección de la cola para las directrices de direccionamiento del nombre de formato de MSMQ sigue el esquema msmq.formatname.
<appSettings>
<add key="orderQueueName" value=".\private$\Orders" />
</appSettings>
La aplicación cliente es una aplicación MSMQ que usa el Send método para enviar un mensaje durable y transaccional a la cola, como se muestra en el código de ejemplo siguiente.
//Connect to the queue.
MessageQueue orderQueue = new MessageQueue(ConfigurationManager.AppSettings["orderQueueName"]);
// Create the purchase order.
PurchaseOrder po = new PurchaseOrder();
po.CustomerId = "somecustomer.com";
po.PONumber = Guid.NewGuid().ToString();
PurchaseOrderLineItem lineItem1 = new PurchaseOrderLineItem();
lineItem1.ProductId = "Blue Widget";
lineItem1.Quantity = 54;
lineItem1.UnitCost = 29.99F;
PurchaseOrderLineItem lineItem2 = new PurchaseOrderLineItem();
lineItem2.ProductId = "Red Widget";
lineItem2.Quantity = 890;
lineItem2.UnitCost = 45.89F;
po.orderLineItems = new PurchaseOrderLineItem[2];
po.orderLineItems[0] = lineItem1;
po.orderLineItems[1] = lineItem2;
// Submit the purchase order.
Message msg = new Message();
msg.Body = po;
//Create a transaction scope.
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
{
orderQueue.Send(msg, MessageQueueTransactionType.Automatic);
// Complete the transaction.
scope.Complete();
}
Console.WriteLine("Placed the order:{0}", po);
Console.WriteLine("Press <ENTER> to terminate client.");
Console.ReadLine();
Al ejecutar el ejemplo, las actividades de cliente y servicio se muestran en las ventanas de servicio y consola de cliente. Puede ver que el servicio recibe mensajes del cliente. Presione Entrar en cada ventana de la consola para cerrar el servicio y el cliente. Tenga en cuenta que, dado que la espera está en uso, el cliente y el servicio no tienen que funcionar al mismo tiempo. Por ejemplo, podría ejecutar el cliente, apagarlo y, a continuación, iniciar el servicio y seguir recibiendo sus mensajes.
Configuración, compilación y ejecución del ejemplo
Asegúrese de que ha realizado el procedimiento de instalación única para los ejemplos de Windows Communication Foundation.
Si el servicio se ejecuta primero, comprobará que la cola está presente. Si la cola no está presente, el servicio creará uno. Puede ejecutar primero el servicio para crear la cola o puede crear uno a través del Administrador de colas de MSMQ. Siga estos pasos para crear una cola en Windows 2008.
Abra el Administrador del servidor en Visual Studio 2012.
Expanda la pestaña Características.
Haga clic con el botón derecho en Cola de mensajes privados y seleccione Nuevo, Cola privada.
Active la casilla Transaccional.
Escriba
ServiceModelSamplesTransacted
como nombre de la nueva cola.
Para compilar el código C# o Visual Basic .NET Edition de la solución, siga las instrucciones de Building the Windows Communication Foundation Samples.
Para ejecutar el ejemplo en una configuración de un solo equipo, siga las instrucciones de Ejecución de los ejemplos de Windows Communication Foundation.
Ejecución del ejemplo entre equipos
Copie los archivos del programa de servicio desde la carpeta \service\bin\, que está dentro de la carpeta específica del idioma, al equipo de servicio.
Copie los archivos de programa cliente de la carpeta \client\bin\, en la carpeta específica del idioma, en el equipo cliente.
En el archivo Client.exe.config, cambie orderQueueName para especificar el nombre del equipo de servicio en lugar de ".".
En el equipo de servicio, inicie Service.exe desde una ventana de comandos.
En el equipo cliente, inicie Client.exe desde un símbolo del sistema.