Compartilhar via


Enfileiramento de mensagens para o Windows Communication Foundation

O exemplo MsmqToWcf demonstra como um aplicativo MSMQ (Enfileiramento de Mensagens) pode enviar uma mensagem MSMQ para um serviço WCF (Windows Communication Foundation). O serviço é um aplicativo de console auto-hospedado que permite que você observe o serviço que está recebendo mensagens na fila.

O contrato de serviço é IOrderProcessor, que define um serviço unidirecional adequado para uso com filas. Uma mensagem MSMQ não tem um cabeçalho Action, portanto, não é possível mapear mensagens MSMQ diferentes para contratos de operação automaticamente. Portanto, pode haver apenas um contrato de operação. Se você quiser definir mais de um contrato de operação para o serviço, o aplicativo deverá fornecer informações sobre qual cabeçalho na mensagem MSMQ (por exemplo, o rótulo ou correlationID) pode ser usado para decidir qual contrato de operação deve ser enviado.

A mensagem MSMQ não contém informações sobre quais cabeçalhos são mapeados para os diferentes parâmetros do contrato de operação. O parâmetro é do tipo MsmqMessage<T>(MsmqMessage<T>), que contém a mensagem MSMQ subjacente. O tipo "T" na classe MsmqMessage<T>(MsmqMessage<T>) representa os dados serializados no corpo da mensagem MSMQ. Neste exemplo, o tipo PurchaseOrder é serializado no corpo da mensagem MSMQ.

O código de exemplo a seguir mostra o contrato de serviço do serviço de processamento 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);
}

O serviço é auto-hospedado. Ao usar o MSMQ, a fila usada deve ser criada com antecedência. Ela pode ser feita manualmente ou por meio de código. Neste exemplo, o serviço verifica a existência da fila e a cria se necessário. O nome da fila é lido no arquivo de configuração.

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);
    …
}

O serviço cria e abre um ServiceHost para o OrderProcessorService, conforme mostrado no código de exemplo a seguir.

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();
}

O nome da fila MSMQ é especificado em uma seção appSettings do arquivo de configuração, conforme mostrado na configuração da amostra.

Observação

O nome da fila usa um ponto (.) para o computador local e separadores de barra invertida no caminho. O endereço do ponto de extremidade WCF especifica um esquema msmq.formatname e usa localhost para o computador local. O endereço da fila para cada diretriz de endereçamento nome de formato MSMQ segue o esquema msmq.formatname.

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

O aplicativo cliente é um aplicativo MSMQ que usa o método Send para enviar uma mensagem durável e transacional para a fila, conforme mostrado no código de exemplo a seguir.

//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();

Quando você executa o exemplo, as atividades de cliente e de serviço são exibidas nas janelas do serviço e do console do cliente. Você pode ver o serviço receber mensagens do cliente. Pressione ENTER em cada janela do console para desligar o serviço e o cliente. Observe que, como a fila está em uso, o cliente e o serviço não precisam estar em funcionamento ao mesmo tempo. Por exemplo, você poderia executar o cliente, desligá-lo e, em seguida, iniciar o serviço, e ele ainda receberia as mensagens.

Configurar, compilar e executar a amostra

  1. Verifique se você executou o Procedimento de instalação única para os exemplos do Windows Communication Foundation.

  2. Se o serviço for executado primeiro, ele verificará se a fila está presente. Se a fila não estiver presente, o serviço criará uma. Você pode executar o serviço primeiro para criar a fila ou pode criar uma por meio do Gerenciador de Filas do MSMQ. Siga estas etapas para criar uma fila no Windows 2008.

    1. Abra o Gerenciador do Servidor no Visual Studio 2012.

    2. Expanda a guia Recursos.

    3. Clique com o botão direito do mouse em Filas de Mensagens Privadas e selecione NovaFila Privada.

    4. Marque a caixa Transacional.

    5. Insira ServiceModelSamplesTransacted como o nome da nova fila.

  3. Para compilar a edição .NET do C# ou do Visual Basic da solução, siga as instruções contidas em Como Compilar as Amostras do Windows Communication Foundation.

  4. Para executar o exemplo em uma configuração de computador único, siga as instruções em Como executar os exemplos do Windows Communication Foundation.

Executar o exemplo em vários computadores

  1. Copie os arquivos do programa de serviço da pasta \service\bin\, na pasta específica do idioma, para o computador de serviço.

  2. Copie os arquivos do programa cliente da pasta \client\bin\ na pasta específica do idioma, para o computador cliente.

  3. No arquivo Client.exe.config, altere o orderQueueName para especificar o nome do computador de serviço em vez de ".".

  4. No computador de serviço, inicie Service.exe a partir de um prompt de comando.

  5. No computador cliente, inicie Client.exe a partir de um prompt de comando.

Confira também