Отправка сообщений из приложения Windows Communication Foundation в приложение MSMQ
В примере 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, между двумя приложениями нет неявного контракта службы. Таким образом, в данном сценарии невозможно создать прокси-класс при помощи средства Svculti.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);
}
}
При выполнении образца действия клиента и службы отображаются в окнах консоли как службы, так и клиента. Можно видеть, как служба получает сообщения от клиента. Нажмите клавишу ВВОД в каждом окне консоли, чтобы закрыть службу и клиент. Обратите внимание, что поскольку используется очередь, клиенту и службе не обязательно быть запущенными и работать одновременно. Например, можно запустить клиент, выключить его, а затем запустить службу и все равно получить сообщения клиента.
Примечание.
Данный образец требует установки очереди сообщений. См. инструкции по установке в очереди сообщений.
Настройка, сборка и запуск примера
Убедитесь, что вы выполнили процедуру однократной установки для примеров Windows Communication Foundation.
При первом запуске служба проверит наличие очереди. Если очередь отсутствует, служба ее создаст. Можно сначала запустить службу, чтобы создать очередь, либо создать ее с помощью диспетчера очередей MSMQ. Чтобы создать очередь в Windows 2008, выполните следующие шаги.
Откройте диспетчер сервера в Visual Studio 2012.
Разверните вкладку "Компоненты ".
Щелкните правой кнопкой мыши очереди частных сообщений и выберите "Создать>частную очередь".
Установите флажок "Транзакция".
Введите
ServiceModelSamplesTransacted
имя новой очереди.
Чтобы создать выпуск решения на C# или Visual Basic, следуйте инструкциям в статье "Создание примеров Windows Communication Foundation".
Чтобы запустить пример в конфигурации с одним компьютером, следуйте инструкциям в разделе "Примеры Windows Communication Foundation".
Запуск примера на компьютерах
Скопируйте на компьютер службы файлы служебной программы из папки \service\bin\ в папку языка.
Скопируйте на клиентские компьютеры файлы из папки \client\bin\ в папку языка.
В файле Client.exe.config измените адрес конечной точки клиента, указав имя компьютера службы вместо «.».
На компьютере службы запустите из командной строки программу Service.exe.
На клиентском компьютере из командной строки запустите программу Client.exe.