Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции OOP c#.doc
Скачиваний:
44
Добавлен:
22.09.2019
Размер:
3.38 Mб
Скачать

3.6. Настройка Remoting при помощи конфигурационных файлов

В предыдущих примерах с использованием Remoting применялось программное конфигурирование инфраструктуры. Такой подход не всегда удобен, особенно если настройки требуется часто изменять. Наряду с программным конфигурированием Remoting допускает настройку с использованием стандартных конфигурационных файлов. Вместо написания такого кода на сервере

HttpChannel chnl = new HttpChannel(1234);

ChannelServices.RegisterChannel(chnl);

RemotingConfiguration.RegisterWellKnownServiceType(

typeof(CustomerManager),

"CustomerManager.soap",

WellKnownObjectMode.Singleton);

допускается использование следующего конфигурационного файла, обеспечивающего аналогичные настройки:

<configuration>

<system.runtime.remoting>

<application>

<channels>

<channel ref="http" port="1234" />

</channels>

<service>

<wellknown mode="Singleton"

type="Server.CustomerManager, Server"

objectUri="CustomerManager.soap" />

</service>

</application>

</system.runtime.remoting>

</configuration>

Для применения настроек конфигурационного файла в вашем приложении достаточно вызвать метод RemotingConfiguration.Configure() и передать ему в качестве параметра имя config-файла:

String filename = "server.exe.config";

RemotingConfiguration.Configure(filename);

Ниже рассмотрены правила создания конфигурационных файлов. Файл с конфигурацией Remoting имеет следующую структуру:

<configuration>

<system.runtime.remoting>

<application>

<lifetime />

<channels />

<service />

<client />

</application>

</system.runtime.remoting>

</configuration>

<lifetime />

Данный тэг используется для изменения параметров лицензии, используемых инфраструктурой по умолчанию. Тэг может иметь следующие атрибуты:

  • leaseTime – начальное время жизни (time to live, TTL) объекта (по умолчанию – 5 минут);

  • sponsorshipTimeout – время ожидания ответа от спонсора (по умолчанию – 2 минуты);

  • renewOnCallTime – время, добавляемое к TTL объекта, когда вызывается его метод (по умолчанию – 2 минуты);

  • leaseManagerPollTime – интервал проверки TTL диспетчером лицензий (по умолчанию – 10 секунд).

Все атрибуты являются необязательными и могут быть заданы в различных временных единицах. При этом используется обозначение D для дней, H для часов, M для минут, S для секунд и MS для миллисекунд. Комбинации вида 1H5M не поддерживаются.

Пример секции <lifetime>:

<lifetime

leaseTime="90MS"

renewOnCallTime="90MS"

leaseManagerPollTime="100MS"

/>

<channels />

Этот тэг служит для группировки тэгов, описывающих отдельные каналы. Сам он не имеет каких-либо атрибутов.

<channel />

Тэг позволяет указать номер порта для канала на стороне сервера, сослаться на нестандартный пользовательский канал, а также провести дополнительную настройку канала. Если планируется использовать стандартные TCP или HTTP каналы, этот тэг не требуется указывать на клиенте, так как стандартные каналы регистрируются .NET Framework автоматически. На стороне сервера требуется указать, по крайней мере, номер порта для канала.

Для ссылки на канал можно использовать два способа: указать короткую именную ссылку для предварительно зарегистрированных каналов или использовать точное имя типа (пространство имен, имя класса, имя сборки), реализующего канал.

Тэг <channel> может иметь следующие атрибуты:

  • ref – ссылка на стандартный канал ("tcp" или "http") или ссылка на канал, предварительно описанный в конфигурационном файле;

  • displayName – используется .NET Framework Configuration Tool;

  • type – главный атрибут, если не задан атрибут ref. Содержит точное имя типа канала, с указанием пространства имен и сборки. Для глобальных сборок требуется указывать сильное имя. В качестве примера использования рассмотрите описание HTTP-канала в файле machine.config;

  • port – Номер порта канала на сервере. Если клиент планирует получать от сервера сообщения обратного вызова, то в качестве номера порта на клиенте требуется указать 0.

В дополнение к описанным атрибутам, HTTP-канал поддерживает следующие дополнительные атрибуты (для некоторых атрибутов указано, где их требуется задавать – на клиенте (К) или на сервере (С)):

  • name – имя канала (по умолчанию "http"). При регистрации нескольких каналов должно быть уникальным, или требуется указать пустую строку (""). Значение данного атрибута можно использовать при вызове функции ChannelServices.GetChannel();

  • priority – индикатор вероятности того, что исполняющая среда выберет данный канал для пересылки данных (по умолчанию параметр равен 1). Чем больше указанное целое число, тем выше вероятность;

  • clientConnectionLimit – число соединений, которые клиент может одновременно открыть к заданному серверу (по умолчанию – 2) (К);

  • proxyName – имя (адрес) прокси-сервера (К);

  • proxyPort – номер порта прокси-сервера (К);

  • suppressChannelData – атрибут указывает, будут ли данные о канале присутствовать в структуре ChannelData, используемой при создании объекта ObjRef (по умолчанию – "false") (С);

  • useIpAddress – значение "true" (по умолчанию) указывает на использование в URL IP-адреса (а не символьного имени сервера) (С);

  • listen – значение "true" (по умолчанию) позволяет использовать перехватчики, прослушивающие канал (С);

  • bindTo – IP-адрес обслуживаемого сервером сетевого адаптера (если их несколько) (С);

  • machineName – имя компьютера, используемого каналом. Указание имени отменяет атрибут useIpAddress (С).

TCP-канал (<channel ref="tcp">) поддерживает атрибуты HTTP-канала и один дополнительный атрибут:

    • rejectRemoteRequests – если данное значение установлено в "true", то сервер принимает запросы Remoting только от приложений с локальной машины (С).

Рассмотрим примеры. На стороне сервера следующую конфигурацию можно использовать для указания канала HTTP, прослушивающего порт 1234:

<channels>

<channel ref="http" port="1234">

</channels>

На стороне клиента при помощи такой настройки можно увеличить число одновременных запросов от клиента к серверу:

<channels>

<channel ref="http" port="0" clientConnectionLimit="100">

</channels>

В рамках каждого канала можно указать и настроить нестандартные канальные приемники и форматеры. Как было сказано выше, Remoting основана на передаче объектов-сообщений. Используя секции конфигурационных файлов <clientProviders> и <serverProviders>, можно задать цепочку канальных приемников, через которые проходит сообщение, и форматер сериализации сообщения.

Структура секции <serverProviders> на стороне сервера выглядит следующим образом:

<channels>

<channel ref="http" port="1234">

<serverProviders>

<formatter />

<provider />

</serverProviders>

</channel>

</channels>

Свойство <formatter> может присутствовать в одном экземпляре, свойств <provider> допускается несколько. Требуется учесть, что порядок свойств <provider> имеет значение. Подробно об атрибутах, специфичных для канальных приемников, будет рассказано ниже.

Следующие атрибуты являются общими, как для приемника, так и для форматера:

  • ref – ссылка на стандартный канальный приемник или форматер ("soap", "binary", "wsdl") или ссылка на канальный приемник или форматер, предварительно описанный в конфигурационном файле;

  • type – главный атрибут, если не задан атрибут ref. Содержит точное имя типа канального приемника, с указанием пространства имен и сборки. Для глобальных сборок требуется указывать сильное имя.

В качестве примера использования обсуждаемых атрибутов и секций рассмотрим следующий. Как известно, по умолчанию канал HTTP использует SOAP-форматер для кодирования сообщений. Следующие фрагменты конфигурационного файла настроят канал на использование двоичного форматера.

На стороне сервера требуется записать в конфигурационном файле1:

<channels>

<channel ref="http" port="1234">

<serverProviders>

<formatter ref="binary" />

</serverProviders>

</channel>

</channels>

На стороне клиента используется такой фрагмент:

<channels>

<channel ref="http>

<clientProviders>

<formatter ref="binary" />

</clientProviders>

</channel>

</channels>

<service />

Тэг позволяет зарегистрировать и настроить удаленные классы с серверной и клиентской активацией, которые публикует данная сборка как сервер. Секция <service> содержит требуемое количество подсекций <wellknown> и <activated>.

<wellknown>

В этой подсекции на стороне сервера описываются публикуемые удаленные типы с серверной активацией. Тэг поддерживает атрибуты, которые аналогичны параметрам вызова метода RegisterWellKnownServiceType():

  • type – информация о типе публикуемого класса в форме "<namespace>.<classname>, <assembly>". Если используется сборка из GAC, требуется указать версию, культуру и public key;

  • mode – индикатор, указывающий вид активации: "Singleton" или "SingleCall";

  • objectUri – концевая точка, URI для обращений к объектам удаленного класса. Если используется IIS-хостинг для классов, URI должен оканчиваться на .soap или .rem для корректной обработки. Эти расширения отображаются на инфраструктуру Remoting в метабазе IIS;

  • displayName – необязательный атрибут, используемый .NET Framework Configuration Tool.

Используя следующий файл, сервер позволяет осуществить доступ к объектам класса CustomerManager по URI http://<host>:1234/CustomerManager.soap:

<configuration>

<system.runtime.remoting>

<application>

<channels>

<channel ref="http" port="1234" />

</channels>

<service>

<wellknown mode="Singleton"

type="Server.CustomerManager, Server"

objectUri="CustomerManager.soap" />

</service>

</application>

</system.runtime.remoting>

</configuration>

<activated>

В подсекции <activated> описываются публикуемые сервером удаленные типы с клиентской активацией. Так как полное имя концевой точки в случае клиентской активации определяется именем приложения сервера, единственный атрибут, который указывается в секции <activated> – это тип публикуемого класса:

    • type – информация о типе публикуемого класса в форме "<namespace>.<classname>, <assembly>". Если используется сборка из GAC, требуется указать версию, культуру и public key.

Следующий пример позволит клиентам создавать объекты класса MyClass по адресу http://<hostname>:1234/

<configuration>

<system.runtime.remoting>

<application>

<channels>

<channel ref="http" port="1234" />

</channels>

<service>

<activated type="MyClass, MyAssembly"/>

</service>

</application>

</system.runtime.remoting>

</configuration>

<client />

На клиентской машине тэг <client> является аналогом тэга <service> на сервере. Структура этих тэгов совпадает:

<configuration>

<system.runtime.remoting>

<application>

<client>

<wellknown />

<activated />

</client>

</application>

</system.runtime.remoting>

</configuration>

При использовании объектов с клиентской активацией тэг <client> должен при помощи атрибута url указать адрес сервера, содержащего типы, указанные в секции <activated>1:

  • url – URL сервера. Обязательно указывать, если используются объекты с клиентской активацией;

  • displayName – необязательный атрибут, используемый .NET Framework Configuration Tool.

Секция <wellknown> используется, чтобы зарегистрировать типы с серверной активацией на клиенте и позволяет использовать оператор new для инициализации ссылок на удаленные объекты. Секция <wellknown> на клиентской стороне имеет такие же атрибуты, как и параметры метода Activator.GetObject():

  • url – полный URL к классу, зарегистрированному на сервере;

  • type – информация о типе публикуемого класса в форме "<namespace>.<classname>, <assembly>". Если используется сборка из GAC, требуется указать версию, культуру и public key;

  • displayName – необязательный атрибут, используемый .NET Framework Configuration Tool.

Если клиент указал некий тип как удаленный, исполняющая среда изменяет поведение оператора new. CLR отслеживает вызовы new, и в том случае, когда речь идет об удаленном типе, возвращается ссылка на серверный объект, а не создается локальный экземпляр типа. В случае следующего конфигурационного файла для получения удаленной ссылки достаточно написать CustomerManager x = new CustomerManager().

<configuration>

<system.runtime.remoting>

<application>

<client>

<wellknown type="Server.CustomerManager, Client"

url="http://localhost:1234/CustomerManager.soap" />

</client>

</application>

</system.runtime.remoting>

</configuration>

Секция <activated> используется, чтобы указать типы с клиентской активацией на клиенте. Так как URL сервера уже был указан как атрибут секции <client>, то единственный атрибут секции <activated> позволяет специфицировать тип:

  • type – информация о типе публикуемого класса в форме "<namespace>.<classname>, <assembly>". Если используется сборка из GAC, требуется указать версию, культуру и public key.

Данные из секции <activated> также используются для переопределения поведения оператора new. При использовании конфигурационного файла, приведенного ниже, для получения удаленной ссылки достаточно написать MyRemote x = new MyRemote().

<configuration>

<system.runtime.remoting>

<application>

<client url="http://localhost:1234">

<activated type="Server.MyRemote, Client" />

</client>

</application>

</system.runtime.remoting>

</configuration>

Клиентское приложение может иметь локальный доступ к библиотеке с удаленными классами (в том случае, если не используется разделение удаленного класса на интерфейс и реализацию). В этом случае следует иметь в виду, что загрузка конфигурационных параметров инфраструктуры Remoting должна быть выполнена до первого вызова конструктора удаленного типа. В противном случае тип будет рассматриваться как локальный и никаких обращений к серверу при работе с объектами производиться не будет.