Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В примере MsmqToWcf показано, как приложение очереди сообщений (MSMQ) может отправлять сообщение MSMQ в службу Windows Communication Foundation (WCF). Служба — это локальное консольное приложение, позволяющее наблюдать за службой, получающей сообщения в очереди.
Контракт службы IOrderProcessor определяет одностороннюю службу, которая подходит для использования с очередями. В сообщении MSMQ нет заголовка действия, поэтому невозможно автоматически сопоставить различные сообщения MSMQ с контрактами операций. Таким образом, может быть только один операционный контракт. Если вы хотите определить несколько контрактов операций для службы, приложение должно предоставить сведения о том, какой заголовок в сообщении MSMQ (например, метка или correlationID) можно использовать, чтобы определить, какой контракт операции выполнять.
Сообщение MSMQ не содержит сведений о том, какие заголовки сопоставляются с разными параметрами контракта операции. Параметр имеет тип MsmqMessage<T>(MsmqMessage<T>), содержащий базовое сообщение MSMQ. Тип "T" в классе MsmqMessage<T>(MsmqMessage<T>) представляет данные, сериализованные в тело сообщения MSMQ. В этом примере тип PurchaseOrder сериализуется в тело сообщения MSMQ.
В следующем примере кода показан контракт службы службы обработки заказов.
// 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);
}
Служба размещена на собственных серверах. При использовании MSMQ необходимо заранее создать очередь. Это можно сделать вручную или с помощью кода. В этом примере служба проверяет наличие очереди и создает ее при необходимости. Имя очереди считывается из файла конфигурации.
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);
…
}
Служба создает и открывает ServiceHost для OrderProcessorService, как показано в следующем примере кода.
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();
}
Имя очереди MSMQ указывается в разделе appSettings файла конфигурации, как показано в следующем примере конфигурации.
Замечание
Имя очереди использует точку (.) для локального компьютера и обратные косые черты как разделители в пути. Адрес конечной точки WCF указывает схему msmq.formatname и использует localhost для локального компьютера. Адрес очереди для каждого правила адресации имен формата MSMQ следует схеме msmq.formatname.
<appSettings>
<add key="orderQueueName" value=".\private$\Orders" />
</appSettings>
Клиентское приложение — это приложение MSMQ, использующее Send метод для отправки устойчивого и транзакционного сообщения в очередь, как показано в следующем примере кода.
//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();
При запуске примера действия клиента и службы отображаются как в окнах службы, так и в консоли клиента. Вы можете увидеть, как служба получает сообщения от клиента. Нажмите клавишу ВВОД в каждом окне консоли, чтобы завершить работу службы и клиента. Обратите внимание, что поскольку используется очередь, клиенту и службе не обязательно работать одновременно. Например, вы можете запустить клиент, завершить его работу, а затем запустить службу, и она будет по-прежнему получать свои сообщения.
Настройка, сборка и запуск примера
Убедитесь, что вы выполнили процедуру настройки One-Time для образцов Windows Communication Foundation.
Если сначала запущена служба, она проверит наличие очереди. Если очередь отсутствует, служба создаст ее. Сначала можно запустить службу для создания очереди или создать ее с помощью диспетчера очередей MSMQ. Выполните следующие действия, чтобы создать очередь в Windows 2008.
Откройте диспетчер серверов в Visual Studio 2012.
Разверните вкладку "Функции" .
Щелкните правой кнопкой мыши Очереди частных сообщенийи выберите Создать, Частную очередь.
Установите флажок транзакционная.
Введите
ServiceModelSamplesTransactedв качестве имени новой очереди.
Чтобы создать версию решения на C# или Visual Basic .NET, следуйте инструкциям по сборке примеров Windows Communication Foundation .
Чтобы запустить пример в конфигурации с одним компьютером, следуйте инструкциям в разделе "Примеры Windows Communication Foundation".
Запустите пример на нескольких компьютерах
Скопируйте файлы программы службы из папки \service\bin\ соответствующего языка на компьютер службы.
Скопируйте файлы клиентской программы из папки \client\bin\ в папку, соответствующую конкретному языку, на клиентский компьютер.
В файле Client.exe.config измените параметр orderQueueName, чтобы указать имя компьютера для сервиса вместо ".".
На компьютере службы запустите Service.exe из командной строки.
На клиентском компьютере запустите Client.exe из командной строки.