Поделиться через


Windows Communication Foundation в Message Queuing

В примере WcfToMsmq показано, как приложение Windows Communication Foundation (WCF) может отправлять сообщение в приложение очереди сообщений (MSMQ). Служба — это локальное консольное приложение, позволяющее наблюдать за службой, получающей сообщения в очереди. Служба и клиент не должны работать одновременно.

Служба получает сообщения из очереди и обрабатывает заказы. Служба создает транзакционную очередь и настраивает обработчик полученных сообщений, что показано в следующем примере кода.

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

При получении сообщения в очереди вызывается обработчик ProcessOrder сообщений.

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

}

Служба извлекает ProcessOrder из текста сообщения MSMQ и обрабатывает заказ.

Имя очереди MSMQ указывается в разделе appSettings файла конфигурации, как показано в следующем примере конфигурации.

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

Замечание

Имя очереди использует точку (.) для локального компьютера и обратные косые черты как разделители в пути.

Клиент создает заказ на покупку и отправляет заказ на покупку в рамках транзакции, как показано в следующем примере кода.

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

Клиент использует настраиваемый клиент для отправки сообщения MSMQ в очередь. Так как приложение, которое получает и обрабатывает сообщение, является приложением MSMQ, а не приложением WCF, между двумя приложениями нет неявного контракта службы. Таким образом, мы не можем создать прокси-сервер с помощью средства Svcutil.exe в этом сценарии.

Настраиваемый клиент по сути одинаков для всех приложений WCF, использующих привязку MsmqIntegration для отправки сообщений. В отличие от других клиентов, он не включает ряд сервисных операций. Это только операция отправки сообщений.

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

При запуске примера действия клиента и службы отображаются как в окнах службы, так и в консоли клиента. Вы можете увидеть, как служба получает сообщения от клиента. Нажмите клавишу ВВОД в каждом окне консоли, чтобы завершить работу службы и клиента. Обратите внимание, что поскольку используется очередь, клиенту и службе не обязательно работать одновременно. Например, вы можете запустить клиент, завершить его работу, а затем запустить службу, и она будет по-прежнему получать свои сообщения.

Замечание

Для этого примера требуется установка очереди сообщений. Ознакомьтесь с инструкциями по установке в Message Queuing.

Настройка, сборка и запуск примера

  1. Убедитесь, что вы выполнили процедуру настройки One-Time для образцов Windows Communication Foundation.

  2. Если сначала запущена служба, она проверит наличие очереди. Если очередь отсутствует, служба создаст ее. Сначала можно запустить службу для создания очереди или создать ее с помощью диспетчера очередей MSMQ. Выполните следующие действия, чтобы создать очередь в Windows 2008.

    1. Откройте диспетчер серверов в Visual Studio 2012.

    2. Разверните вкладку "Функции" .

    3. Щелкните правой кнопкой мыши очереди частных сообщений и выберите "Создать>частную очередь".

    4. Установите флажок транзакционная.

    5. Введите ServiceModelSamplesTransacted в качестве имени новой очереди.

  3. Чтобы создать версию решения на C# или Visual Basic, следуйте инструкциям в разделе постройки примеров Windows Communication Foundation.

  4. Чтобы запустить пример в конфигурации с одним компьютером, следуйте инструкциям в разделе "Примеры Windows Communication Foundation".

Запустите пример на нескольких компьютерах

  1. Скопируйте файлы программы службы из папки \service\bin\ соответствующего языка на компьютер службы.

  2. Скопируйте файлы клиентской программы из папки \client\bin\ в папку, соответствующую конкретному языку, на клиентский компьютер.

  3. В файле Client.exe.config измените адрес конечной точки клиента, чтобы указать имя компьютера службы вместо ".".

  4. На компьютере службы запустите Service.exe из командной строки.

  5. На клиентском компьютере запустите Client.exe из командной строки.

См. также