Разработка распределенных приложений в Microsoft.NET Framework

         

Сервисы COM+ без компонент COM+


Сервисы без компонент (SWC) позволяют использовать сервисы среды COM+ без создания приложение COM+ и без наследования от класса ServicedComponent.

Для включения возможностей SWC следует включить сначала доступ по TCP/IP к координатору распределенных транзакций. По умолчанию эта возможность отключена в Windows 2003 и Windows XP SP2, поскольку уменьшает безопасность системы. Если компьютер подключен к интернету через NAT, то ее включение достаточно безопасно. Эту опцию можно включить через оснастку %systemroot%\system32\Com\comexp.msc или импортом следующего файла в системный реестр:

REGEDIT4 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSDTC\Security] "NetworkDtcAccess"=dword:00000001

Затем следует перезапустить службу координатора распределенных транзакций

net stop MSDTC net start MSDTC

Рассмотрим класс, облегчающий использование SWC. Поскольку использование COM+ связано с использованием неуправляемых ресурсов, класс реализует интерфейс System.IDisposable с единственным методом void Dispose(), осуществляющим выход их домена COM+.

using System; using System.EnterpriseServices; namespace Seva.Swc { public class SwcUtil : IDisposable { public SwcUtil() { ServiceDomain.Enter(GetConfig(TransactionOption.Required)); } public SwcUtil(TransactionOption transactionOption) { ServiceDomain.Enter(GetConfig(transactionOption)); } protected virtual ServiceConfig GetConfig( TransactionOption transactionOption) { ServiceConfig config = new ServiceConfig(); config.Transaction = transactionOption; config.TrackingEnabled = true; config.TrackingAppName = "SwcUtil"; config.TrackingComponentName = this.GetType().FullName; return config; } public void Dispose() { ServiceDomain.Leave(); } } }

Пример использования данного класса приведен ниже. В качестве примера рассмотрена работа с очередями сообщений с использованием транзакций COM+.

using System; using System.EnterpriseServices; using System.Messaging; using Seva.Msmq; using Seva.Swc; public class MainApp { public static void Main() { using (SwcUtil swc = new SwcUtil()) { MessageQueue queue = MsmqTools.CreateQueue(@".\Private$\swc_queue"); queue.Send("SWC Message", MessageQueueTransactionType.Automatic); Console.WriteLine("Нажмите <Enter> для завершения транзакции"); Console.ReadLine(); ContextUtil.SetComplete(); } } }

Использование SWC не требует подписанной сборки, поскольку сборка не регистрируется в качестве приложения COM+.

К сожалению, при использовании SWC невозможно использовать компенсирующий менеджер ресурсов. Во первых, класс Compensator наследован от System.EnterpriseServices.ServicedComponent, то есть является обслуживаемой компонентой, поэтому для его использования должно быть создано приложение COM+. Поэтому при создании секретаря класса Clerk и регистрации компенсатора при использовании сервисов без компонент происходит catastrophic exception, если сборка подписана, иначе – жалоба на отсутствие подписи. Таким образом, сервисы без компонент следует считать полумерой, благодаря которой можно работать с ресурсами, поддерживающими распределенные транзакции, такими как MSMQ или MS SQL.



Содержание раздела