Чтение онлайн

ЖАНРЫ

ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание

Троелсен Эндрю

Шрифт:

Таблица 18.4. Подборка членов типа ChannelServices

Член Описание
RegisteredChannels Свойство, получающее или устанавливающее список зарегистрированных в настоящий момент каналов, каждый из которых представляется интерфейсом IChannel
DispatchMessage Метод, выполняющий обработку поступающих удаленных вызовов
GetChannel Метод, возвращающий зарегистрированный канал с указанным именем
GetUrlsForObject Метод, возвращающий массив адресов URL, которые могут использоваться для доступа к указанному
объекту
RegisterChannel Метод, регистрирующий канал о соответствующими канальными сервисами
UnregisterChannel Метод, отменяющий регистрацию данного канала и удаляющий этот канал из списка зарегистрированных

Определение интерфейса IChannel оказывается исключительно простым.

publiс interface IChannel {

 string ChannelName { get; }

 int ChannelPriority { get; }

 string Parse(string url, ref String objectURI);

}

Как видите, каждый канал получает понятное строковое имя, а также свой уровень приоритета. Например, если добавить в метод Main приложения SimpleRemoteObjectClient следующую) программную логику

// Список всех зарегистрированных каналов.

IChannel[] сhannelObjs = ChannelServices.RegisteredChannels;

foreach (IChannel i in channelObjs) {

 Console.WriteLine("Имя канала: {0}", i.ChannelName);

 Console.WriteLine("Приоритет: {0}", i.ChannelPriority);

}

то в окне консоли клиента вы увидите вывод, подобный показанному на рис. 18.4.

Рис. 18.4. Список каналов в окне клиента

Тип RemotingConfiguration

Другим ключевым типом удаленного взаимодействия является тип RemotingConfiguration, который, в соответствии со своим названием, используется для настройки различных параметров приложения удаленного взаимодействия. Вы уже видели этот тип в работе на стороне сервера (при вызове метода RegisterWellKnownServiceType). Другие заслуживающие внимания статические члены этого типа описываются в табл. 18.5, а возможности применения некоторых из этих членов будут продемонстрированы в оставшейся части этой главы.

Таблица 18.5. Члены типа RemotingConfiguration 

Член Описание
ApplicationId Возвращает идентификатор приложения, выполняющегося в настоящий момент
ApplicationName Возвращает или устанавливает имя приложения удаленного взаимодействия
ProcessId Возвращает идентификатор процесса, выполняющегося в настоящий момент
Configure Читает файл конфигурации и устанавливает параметры конфигурации инфраструктуры удаленного взаимодействия
GetRegisteredActivatedClientTypes Возвращает массив объектных типов, зарегистрированных на стороне клиента для удаленной активизации
GetRegisteredActivatedServiceTypes Возвращает массив объектных типов, зарегистрированных на стороне сервиса для активизации по запросу клиента
GetRegisteredWellKnownClientTypes Возвращает массив объектных типов, зарегистрированных на стороне клиента в качестве WKO-типов
GetRegisteredWellKnownServiceTypes Возвращает массив объектных типов, зарегистрированных на стороне сервиса в качестве WKO-типов
IsWellKnownClientType Проверяет, является ли указанный объектный тип зарегистрированным WKO-типом
клиента
RegisterActivatedClientType Регистрирует объект на стороне клиента как тип, позволяющий активизацию на сервере
RegisterWellKnownClientType Регистрирует объект на стороне клиента как WKO-тип (синглет или объект одиночного вызова)
RegisterWellKnownServiceType Регистрирует объект на стороне сервиса как WKO-тип (синглет или объект одиночного вызова)

Напомним, что слой удаленного взаимодействия .NET различает два вида MBR-объектов: WKO (активизируются сервером) и САО (активизируются клиентом). К тому же, WKO-тип может быть активизирован либо как синглет, либо как объект одиночного вызова. Используя функциональные возможности типа RemotingConfiguration, вы можете динамически получить такую информацию в среде выполнения. Например, если добавить в метод Main приложения SimpleRemoteObjectServer следующие строки программного кода:

static void Main(string[] args) {

 …

 // Установка понятного имени для данного приложения сервера.

 RemotingConfiguration.ApplicationName = "Первое серверное приложение";

 Console.WriteLine("Имя приложения: {0}", RemotingConfiguration.ApplicationName);

 // Получение массива типов WellKnownServiceTypeEntry,

 // представляющих зарегистрированные WKO-объекты.

 WellKnownServiceTypeEntry[] WKOs = RemotingConfiguration.GetRegisteredWellKnownServiceTypes;

 // Вывод информации.

 foreach(WellKnownServiceTypeEntry wko in WKOs) {

Console.WriteLine("Имя блока, содержащего WKO: {0}", wko.AssemblyName);

Console.WriteLine("URL данного WKO: {0}", wko.ObjectUri);

Console.WriteLine("Тип WKO: {0}", wko.ObjectType);

Console.WriteLine("Режим активизации WKO: {0}", wko.Mоde);

 }

}

то вы должны увидеть список всех WKO-типов, зарегистрированных доменом приложения сервера. Выполнив цикл по всем элементам массива типов WellKnownServiceTypeEntry, можно выяснить характеристики каждого из WKO-объектов. Поскольку ваше серверное приложение регистрирует только один тип (SimpleRemotingAsm.RemoteMessageObject), вы получите вывод, показанный на рис. 18.5.

Рис. 18.5. Статистика сервера

Другим важным методом типа RemotingConfiguration является метод Configure. Вскоре вы сможете убедиться, что этот статический член позволяет доменам приложений клиента и сервера использовать файлы конфигурации удаленного взаимодействия.

Снова о режиме активизации WKO-типов

Напомним, что WKO-типы можно настроить для работы либо в режиме синглета, либо в режиме объекта одиночного вызова. В настоящее время ваше серверное приложение регистрирует WKO-тип с использованием семантики активизации синглета.

// Синглеты могут обслуживать множество клиентов.

RemotingConfiguration.RegisterWellKnownServiceType(typeof(SimpleRemotingAsm.RemoteMessageObject), "RemoteMsgObj.soap", WellKnownObjectMode.Singleton);

Снова обратим внимание на то, что WKO-синглеты могут получать запросы от множества клиентов. Поэтому синглеты связаны с удаленными клиентами отношением "один ко множеству". Чтобы проверить это непосредственно, запустите приложение сервера (если оно в настоящий момент еще не выполняется) и три отдельных приложения клиента. Если посмотреть на вывод сервера, вы обнаружите там только один вызов заданного по умолчанию конструктора RemoteMessageObject.

Чтобы рассмотреть поведение объектов одиночного вызова, измените серверное приложение так, чтобы в нем регистрировался WKO-объект, поддерживающий активизацию одиночного вызова.

Поделиться с друзьями: