Промежуточная среда COM+ и служба Enterprise Services
Сервисы 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.
6.4. Выводы по использованию среды Enterprise Services / COM+
Хотя COM+ имеет обширные возможности для создания распределенных систем внутри предприятия, ей свойственны и следующие недостатки.
- Среда COM+ разработана до .NET Framework, поэтому в среде Enterprise Services существуют ограничения на классы .NET Framework, регистрируемые в качестве обслуживаемых компонент. При использовании компонент Enterprise Services проявляются некоторые особенности работы с ними, являющиеся следствием нетривиального взаимодействия CLR и COM+.
- Компоненты COM+ не могут использоваться вне доверенной сети, поскольку для их использования должен быть открыт, в частности, доступ к порту RPC (135-ый порт TCP). С данным портом связан большой и, вероятно, еще незаконченный список общеизвестных уязвимостей.
Рассмотрим промежуточную среду COM+ с точки зрения требований к распределенной системе.
- Открытость. Служба COM+ является внутренней технологией Microsoft и реализована только в операционной системе Windows 2000 и последующих версиях Windows. Для использования обслуживаемой компоненты нужно иметь как минимум доступ к сборке с ее интерфейсом и иметь установленный посредник компоненты COM+. Таким образом, среда Enterprise Services не является открытой.
- Масштабируемость. Служба COM+ поддерживает балансировку нагрузок путем создания кластера машин на основе Windows Server. Выбор используемого сервера осуществляется только в момент создания объекта клиентом, даже при использовании JIT активации. Среда COM+ поддерживает модель единственного вызова с пулом объектов, что позволяет добиться баланса времени создания удаленного объекта и используемой сервером памяти.
- Поддержание логической целостности данных. COM+ использует координатор распределенных транзакций из сервера транзакций Microsoft (MTS) и позволяет создавать менеджеры управления ресурсами.
- Устойчивость. Посредники приложения COM+ связывают клиентский компьютер с именем компьютера (DNS или NETBIOS), на котором развернуто приложение COM+. Таким образом, этот компьютер является слабым местом системы (в случае использования кластера приложений им является планировщик кластера COM+). Для решения этой проблемы можно использовать сервисы Windows Clustering, позволяющие создать дублера данного компьютера, начинающего функционировать в случае выхода основного планировщика. Таким образом, использующая среду COM+ распределенная система может не иметь уникальной точки сбоя.
- Эффективность (в узком смысле). Среда COM+ взаимодействует со средой .Net достаточно сложным образом, вероятно приводящим к определенным накладным расходам.
- Безопасность. COM+ позволяет использовать встроенные механизмы безопасности Microsoft Windows.
Можно сделать вывод, что хотя промежуточная среда EnterpriseServices/COM+ предоставляет обширный набор сервисов для компонент распределенной системы, но ее использование ограничено взаимодействием компонент внутри локальной или виртуальной частной сети, построенной на базе Microsoft Windows в пределах одного предприятия.