Compartir a través de


Windows Communication Foundation a Message Queuing

El ejemplo WcfToMsmq muestra cómo una aplicación de Windows Communication Foundation (WCF) puede enviar un mensaje a una aplicación Message Queuing (MSMQ). El servicio es una aplicación de consola autohospedada que le permite observar el servicio que recibe los mensajes en cola. El servicio y el cliente no tienen que ejecutarse al mismo tiempo.

El servicio recibe mensajes de la cola y procesa los pedidos. El servicio crea una cola transaccional y configura un controlador de mensajes recibidos, como se muestra en el código de ejemplo siguiente.

static void Main(string[] args)
{
    if (!MessageQueue.Exists(
              ConfigurationManager.AppSettings["queueName"]))
       MessageQueue.Create(
           ConfigurationManager.AppSettings["queueName"], true);
        //Connect to the queue
        MessageQueue Queue = new
    MessageQueue(ConfigurationManager.AppSettings["queueName"]);
    Queue.ReceiveCompleted +=
                 new ReceiveCompletedEventHandler(ProcessOrder);
    Queue.BeginReceive();
    Console.WriteLine("Order Service is running");
    Console.ReadLine();
}

Cuando se recibe un mensaje en la cola, se invoca a ProcessOrder del controlador de mensajes.

public static void ProcessOrder(Object source,
    ReceiveCompletedEventArgs asyncResult)
{
    try
    {
        // Connect to the queue.
        MessageQueue Queue = (MessageQueue)source;
        // End the asynchronous receive operation.
        System.Messaging.Message msg =
                     Queue.EndReceive(asyncResult.AsyncResult);
        msg.Formatter = new System.Messaging.XmlMessageFormatter(
                                new Type[] { typeof(PurchaseOrder) });
        PurchaseOrder po = (PurchaseOrder) msg.Body;
        Random statusIndexer = new Random();
        po.Status = PurchaseOrder.OrderStates[statusIndexer.Next(3)];
        Console.WriteLine("Processing {0} ", po);
        Queue.BeginReceive();
    }
    catch (System.Exception ex)
    {
        Console.WriteLine(ex.Message);
    }

}

El servicio extrae el ProcessOrder del cuerpo del mensaje MSMQ y procesa al pedido.

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.

<appSettings>
    <add key="orderQueueName" value=".\private$\Orders" />
</appSettings>

Nota:

El nombre de la cola utiliza un punto (.) para el equipo local y separadores con barra diagonal inversa en su ruta de acceso.

El cliente crea un pedido de compra y envía el pedido de compra dentro del ámbito de una transacción, como se muestra en el código de ejemplo siguiente.

// Create the purchase order
PurchaseOrder po = new PurchaseOrder();
// Fill in the details
...

OrderProcessorClient client = new OrderProcessorClient("OrderResponseEndpoint");

MsmqMessage<PurchaseOrder> ordermsg = new MsmqMessage<PurchaseOrder>(po);
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
{
    client.SubmitPurchaseOrder(ordermsg);
    scope.Complete();
}
Console.WriteLine("Order has been submitted:{0}", po);

//Closing the client gracefully closes the connection and cleans up resources
client.Close();

El cliente utiliza un cliente personalizado en orden para enviar el mensaje de MSMQ a la cola. Dado que la aplicación que recibe y procesa el mensaje es una aplicación MSMQ y no una aplicación WCF, no hay ningún contrato de servicio implícito entre las dos aplicaciones. Por lo tanto, no podemos crear un proxy mediante la herramienta Svcutil.exe en este escenario.

El cliente personalizado es esencialmente el mismo para todas las aplicaciones WCF que usan el MsmqIntegration enlace para enviar mensajes. A diferencia de otros clientes, no incluye una gama de operaciones de servicio. Solo es una operación de envío de mensajes.

[System.ServiceModel.ServiceContractAttribute(Namespace = "http://Microsoft.ServiceModel.Samples")]
public interface IOrderProcessor
{
    [OperationContract(IsOneWay = true, Action = "*")]
    void SubmitPurchaseOrder(MsmqMessage<PurchaseOrder> msg);
}

public partial class OrderProcessorClient : System.ServiceModel.ClientBase<IOrderProcessor>, IOrderProcessor
{
    public OrderProcessorClient(){}

    public OrderProcessorClient(string configurationName)
        : base(configurationName)
    { }

    public OrderProcessorClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress address)
        : base(binding, address)
    { }

    public void SubmitPurchaseOrder(MsmqMessage<PurchaseOrder> msg)
    {
        base.Channel.SubmitPurchaseOrder(msg);
    }
}

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.

Nota:

Este ejemplo requiere la instalación de Message Queuing. Consulte las instrucciones de instalación en Message Queuing.

Configuración, compilación y ejecución del ejemplo

  1. Asegúrese de que ha realizado el procedimiento de instalación única para los ejemplos de Windows Communication Foundation.

  2. 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.

    1. Abra el Administrador del servidor en Visual Studio 2012.

    2. Expanda la pestaña Características.

    3. Haga clic con el botón derecho en Colas de mensajes privados y, luego, seleccione Nuevo>Cola privada.

    4. Active la casilla Transaccional.

    5. Escriba ServiceModelSamplesTransacted como nombre de la nueva cola.

  3. Para compilar la edición de C# o de Visual Basic de la solución, siga las instrucciones que aparecen en Compilación de los ejemplos de Windows Communication Foundation.

  4. 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

  1. 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.

  2. Copie los archivos de programa cliente de la carpeta \client\bin\, en la carpeta específica del idioma, en el equipo cliente.

  3. En el archivo Client.exe.config, cambie la dirección del punto de conexión de cliente para especificar el nombre del equipo de servicio en lugar de ".".

  4. En el equipo de servicio, inicie Service.exe desde una ventana de comandos.

  5. En el equipo cliente, inicie Client.exe desde un símbolo del sistema.

Consulte también