Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В примере 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.
Настройка, сборка и запуск примера
Убедитесь, что вы выполнили процедуру настройки One-Time для образцов 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 из командной строки.