Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В примере MsmqActivation показано, как размещать приложения в службе активации процессов Windows (WAS), которые считываются из очереди сообщений. В этом примере используется netMsmqBinding, и он основан на примере Two-Way Communication. Услуга в этом случае является веб-приложением, а клиент размещается на собственных серверах и выводит данные в консоль, чтобы наблюдать за состоянием отправленных заказов на покупку.
Замечание
Процедура установки и инструкции по сборке для этого примера находятся в конце этого раздела.
Служба активации процессов Windows (WAS), новый механизм активации процесса для Windows Server 2008 предоставляет такие функции, как IIS, которые ранее были доступны только приложениям на основе HTTP для приложений, использующих протоколы, отличные от HTTP. Windows Communication Foundation (WCF) использует интерфейс адаптера прослушивателя для обмена данными о запросах активации, полученных через протоколы, отличные от HTTP, поддерживаемые WCF, такие как TCP, именованные каналы и MSMQ. Функции получения запросов через протоколы, отличные от HTTP, размещаются управляемыми службами Windows, работающими в SMSvcHost.exe.
Служба адаптера прослушивателя Net.Msmq (NetMsmqActivator) активирует очередные приложения на основе сообщений в очереди.
Клиент отправляет заказы на покупку в службу в рамках транзакции. Служба получает заказы в рамках транзакции и обрабатывает их. Затем служба перезванивает клиенту и сообщает о состоянии заказа. Чтобы облегчить двустороннюю связь, клиент и служба используют очереди для постановки заказов на покупку и статусов заказа.
Контракт IOrderProcessor обслуживания определяет односторонние операции, связанные с управлением очередью. Операция службы использует конечную точку ответа для отправки состояний заказа клиенту. Адрес конечной точки ответа — это универсальный код ресурса (URI) очереди, используемой для отправки состояния заказа клиенту. Приложение обработки заказов реализует этот контракт.
[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")]
public interface IOrderProcessor
{
[OperationContract(IsOneWay = true)]
void SubmitPurchaseOrder(PurchaseOrder po,
string reportOrderStatusTo);
}
Контракт ответа для отправки состояния заказа указан клиентом. Клиент реализует контракт состояния заказа. Служба использует созданный клиент этого контракта для отправки состояния заказа обратно клиенту.
[ServiceContract]
public interface IOrderStatus
{
[OperationContract(IsOneWay = true)]
void OrderStatus(string poNumber, string status);
}
Операция службы обрабатывает отправленный заказ на покупку. К операции службы применяется OperationBehaviorAttribute, чтобы указать автоматическое участие в транзакции, которая используется для получения сообщения из очереди, и автоматическое завершение транзакции при завершении операции службы. Класс Orders инкапсулирует функции обработки заказов. В этом случае он добавляет заказ на покупку в словарь. Транзакция, в которую включена операция службы, доступна операциям в Orders классе.
Операция службы, помимо обработки отправленного заказа на покупку, возвращает клиенту ответы о состоянии заказа.
public class OrderProcessorService : IOrderProcessor
{
[OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
public void SubmitPurchaseOrder(PurchaseOrder po, string reportOrderStatusTo)
{
Orders.Add(po);
Console.WriteLine("Processing {0} ", po);
Console.WriteLine("Sending back order status information");
NetMsmqBinding msmqCallbackBinding = new NetMsmqBinding();
msmqCallbackBinding.Security.Mode = NetMsmqSecurityMode.None;
OrderStatusClient client = new OrderStatusClient(msmqCallbackBinding, new EndpointAddress(reportOrderStatusTo));
// please note that the same transaction that is used to dequeue purchase order is used
// to send back order status
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
{
client.OrderStatus(po.PONumber, po.Status);
scope.Complete();
}
}
}
Используемая клиентская привязка указывается с помощью файла конфигурации.
Имя очереди MSMQ указывается в разделе appSettings файла конфигурации. Конечная точка службы определена в разделе System.serviceModel файла конфигурации.
Замечание
Имя очереди MSMQ и адрес конечной точки используют несколько разные соглашения об адресации. Имя очереди MSMQ использует точку (.) для обозначения локального компьютера и обратную косую черту как разделитель в пути. Адрес конечной точки WCF указывает схему net.msmq, использует localhost для локального компьютера и использует косую черту в пути. Чтобы прочитать из очереди, размещенной на удаленном компьютере, замените '.' и 'localhost' на имя удаленного компьютера.
SVC-файл с именем класса используется для размещения кода службы в WAS.
Сам файл Service.svc содержит директиву для создания OrderProcessorService.
<%@ServiceHost language="c#" Debug="true" Service="Microsoft.ServiceModel.Samples.OrderProcessorService"%>
Файл Service.svc также содержит директиву сборки, чтобы обеспечить загрузку System.Transactions.dll.
<%@Assembly name="System.Transactions, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"%>
Клиент создает область транзакции. Взаимодействие со службой происходит в пределах области транзакции, что приводит к тому, что она будет рассматриваться как атомарная единица, в которой все сообщения завершаются успешно или завершаются сбоем. Транзакция фиксируется путем вызова Complete области транзакции.
using (ServiceHost serviceHost = new ServiceHost(typeof(OrderStatusService)))
{
// Open the ServiceHostBase to create listeners and start listening
// for order status messages.
serviceHost.Open();
// Create a proxy with given client endpoint configuration
OrderProcessorClient client = new OrderProcessorClient();
// 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;
//Create a transaction scope.
using (TransactionScope scope = new
TransactionScope(TransactionScopeOption.Required))
{
// Make a queued call to submit the purchase order
client.SubmitPurchaseOrder(po,
"net.msmq://localhost/private/ServiceModelSamplesOrder/OrderStatus");
// Complete the transaction.
scope.Complete();
}
//Closing the client gracefully closes the connection and cleans up
//resources
client.Close();
Console.WriteLine();
Console.WriteLine("Press <ENTER> to terminate client.");
Console.ReadLine();
// Close the ServiceHostBase to shutdown the service.
serviceHost.Close();
}
Клиентский IOrderStatus код реализует контракт для получения состояния заказа от службы. В этом случае он выводит состояние заказа.
[ServiceBehavior]
public class OrderStatusService : IOrderStatus
{
[OperationBehavior(TransactionAutoComplete = true,
TransactionScopeRequired = true)]
public void OrderStatus(string poNumber, string status)
{
Console.WriteLine("Status of order {0}:{1} ",
poNumber , status);
}
}
Очередь состояния заказа создается в методе Main . Конфигурация клиента включает конфигурацию службы состояния заказа для размещения службы состояния заказа, как показано в следующем примере конфигурации.
<appSettings>
<!-- use appSetting to configure MSMQ queue name -->
<add key="targetQueueName" value=".\private$\ServiceModelSamples/service.svc" />
<add key="responseQueueName" value=".\private$\ServiceModelSamples/OrderStatus" />
</appSettings>
<system.serviceModel>
<services>
<service
name="Microsoft.ServiceModel.Samples.OrderStatusService">
<!-- Define NetMsmqEndpoint -->
<endpoint address="net.msmq://localhost/private/ServiceModelSamples/OrderStatus"
binding="netMsmqBinding"
contract="Microsoft.ServiceModel.Samples.IOrderStatus" />
</service>
</services>
<client>
<!-- Define NetMsmqEndpoint -->
<endpoint name="OrderProcessorEndpoint"
address="net.msmq://localhost/private/ServiceModelSamples/service.svc"
binding="netMsmqBinding"
contract="Microsoft.ServiceModel.Samples.IOrderProcessor" />
</client>
</system.serviceModel>
При запуске примера действия клиента и службы отображаются как в окнах сервера, так и в консоли клиента. Вы можете увидеть, как сервер получает сообщения от клиента. Нажмите клавишу ВВОД в каждом окне консоли, чтобы завершить работу сервера и клиента.
Клиент отображает сведения о состоянии заказа, отправляемые сервером:
Press <ENTER> to terminate client.
Status of order 70cf9d63-3dfa-4e69-81c2-23aa4478ebed :Pending
Настройка, сборка и запуск примера
Убедитесь, что служба IIS 7.0 установлена, так как она требуется для активации WAS.
Убедитесь, что вы выполнили процедуру настройки One-Time для образцов Windows Communication Foundation. Кроме того, необходимо установить компоненты активации WCF, отличные от HTTP:
В меню "Пуск " выберите панель управления.
Выберите программы и компоненты.
Нажмите кнопку "Включить или отключить компоненты Windows".
В разделе "Сводка функций" нажмите кнопку "Добавить компоненты".
Разверните узел Microsoft .NET Framework 3.0 и проверьте функцию активации Windows Communication Foundation без HTTP.
Чтобы создать версию решения на C# или Visual Basic .NET, следуйте инструкциям по сборке примеров Windows Communication Foundation .
Запустите клиент, выполнив client.exe из командного окна. При этом создается очередь и отправляется в нее сообщение. Оставьте клиент запущенным, чтобы увидеть результат службы чтения сообщения
По умолчанию служба активации MSMQ выполняется как сетевая служба. Поэтому очередь, используемая для активации приложения, должна иметь разрешения на получение и просмотр для Сетевой службы. Эту очередь сообщений можно настроить с помощью консоли MMC.
В меню "Пуск" нажмите кнопку "Выполнить", а затем введите
Compmgmt.mscи нажмите клавишу ВВОД.В разделе "Службы и приложения" разверните очередь сообщений.
Щелкните частные очереди.
Щелкните правой кнопкой мыши очередь (servicemodelsamples/Service.svc) и выберите "Свойства".
На вкладке "Безопасность" нажмите кнопку "Добавить " и "Показать" и получите разрешения для сетевой службы.
Настройте службу активации процесса Windows (WAS) для поддержки активации MSMQ.
В качестве удобства следующие шаги реализуются в пакетном файле с именем AddMsmqSiteBinding.cmd, расположенном в примере каталога.
Чтобы поддерживать активацию net.msmq, веб-сайт по умолчанию должен быть привязан к протоколу net.msmq. Это можно сделать с помощью appcmd.exe, установленной с набором инструментов управления IIS 7.0. В командной строке с повышенными привилегиями (администратор) выполните следующую команду.
%windir%\system32\inetsrv\appcmd.exe set site "Default Web Site" -+bindings.[protocol='net.msmq',bindingInformation='localhost']Замечание
Эта команда представляет собой одну строку текста.
Эта команда добавляет привязку сайта net.msmq к веб-сайту по умолчанию.
Хотя все приложения на сайте совместно используют общую привязку net.msmq, каждое приложение может включить поддержку net.msmq по отдельности. Чтобы включить net.msmq для приложения /servicemodelsamples, выполните следующую команду из командной строки с повышенными привилегиями.
%windir%\system32\inetsrv\appcmd.exe set app "Default Web Site/servicemodelsamples" /enabledProtocols:http,net.msmqЗамечание
Эта команда представляет собой одну строку текста.
Эта команда позволяет получить доступ к приложению /servicemodelsamples с помощью
http://localhost/servicemodelsamplesиnet.msmq://localhost/servicemodelsamples.
Если вы не сделали этого ранее, убедитесь, что служба активации MSMQ включена. В меню "Пуск " нажмите кнопку "Выполнить" и введите
Services.msc. Выполните поиск по списку служб для адаптера прослушивателя Net.Msmq. Щелкните его правой кнопкой мыши и выберите Свойства. Задайте для параметра "Тип запуска " значение "Автоматически", нажмите кнопку "Применить " и нажмите кнопку "Пуск ". Этот шаг необходимо выполнить только один раз до первого использования службы адаптера прослушивателя Net.Msmq.Чтобы запустить пример в конфигурации с одним или несколькими компьютерами, следуйте инструкциям в разделе "Примеры Windows Communication Foundation". Кроме того, измените код на клиенте, который отправляет заказ на покупку, чтобы отразить имя компьютера в URI очереди при отправке заказа на покупку. Используйте следующий код:
client.SubmitPurchaseOrder(po, "net.msmq://localhost/private/ServiceModelSamples/OrderStatus");Удалите привязку сайта net.msmq, добавленную для этого примера.
В качестве удобства следующие шаги реализуются в пакетном файле с именем RemoveMsmqSiteBinding.cmd, расположенном в примере каталога:
Удалите net.msmq из списка включенных протоколов, выполнив следующую команду из командной строки с повышенными привилегиями.
%windir%\system32\inetsrv\appcmd.exe set app "Default Web Site/servicemodelsamples" /enabledProtocols:httpЗамечание
Эта команда представляет собой одну строку текста.
Удалите привязку сайта net.msmq, выполнив следующую команду из командной строки с повышенными привилегиями.
%windir%\system32\inetsrv\appcmd.exe set site "Default Web Site" --bindings.[protocol='net.msmq',bindingInformation='localhost']Замечание
Эта команда представляет собой одну строку текста.
Предупреждение
Запуск пакетного файла восстановит параметры DefaultAppPool для работы с .NET Framework версии 2.0.
По умолчанию с транспортом привязки netMsmqBinding безопасность включена. Два свойства, MsmqAuthenticationMode и MsmqProtectionLevel, вместе определяют тип транспортной безопасности. По умолчанию режим проверки подлинности задан как Windows, а уровень защиты установлен на Sign. Чтобы MSMQ предоставил функцию проверки подлинности и подписывания, она должна быть частью домена. При запуске этого примера на компьютере, который не является частью домена, возникает следующая ошибка: "Внутренний сертификат очереди сообщений пользователя не существует".
Запуск примера на компьютере, присоединенном к рабочей группе
Если ваш компьютер не является частью домена, отключите транспортную безопасность, установив режим проверки подлинности и уровень защиты в значение «нет», как показано в следующем примере конфигурации.
<bindings> <netMsmqBinding> <binding configurationName="TransactedBinding"> <security mode="None"/> </binding> </netMsmqBinding> </bindings>Перед запуском примера измените конфигурацию на сервере и клиенте.
Замечание
Настройка
security modeнаNoneэквивалентна установке безопасностиMsmqAuthenticationMode,MsmqProtectionLevelиMessageвNone.Чтобы включить активацию на компьютере, присоединенном к рабочей группе, служба активации и рабочий процесс должны выполняться с определенной учетной записью пользователя (должна быть одинаковой для обоих), а очередь должна иметь списки управления доступом для конкретной учетной записи пользователя.
Чтобы изменить идентификацию, под которой выполняется рабочий процесс, выполните следующие действия.
Запустите Inetmgr.exe.
В разделе Пулы приложений щелкните правой кнопкой мыши AppPool (обычно DefaultAppPool) и выберите "Задать значения по умолчанию пула приложений...".
Измените свойства удостоверения, чтобы использовать определенную учетную запись пользователя.
Чтобы изменить учетную запись, под которой работает служба активации.
Запустите Services.msc.
Щелкните правой кнопкой мыши адаптер Net.MsmqListener и выберите пункт "Свойства".
Измените учетную запись на вкладке LogOn .
В рабочей среде служба также должна выполняться с помощью неограниченного токена. Для этого выполните следующие действия в командном окне:
sc sidtype netmsmqactivator unrestricted