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

ЖАНРЫ

C# для профессионалов. Том II

Ватсон Карли

Шрифт:

ILease lease = (ILease)obj.GetLifetimeService;

if (lease != null) {

 Console.WriteLine("Lease Configuration:");

 Console.WriteLine(

"InitialLeaseTime: " + lease.InitialLeaseTime);

 Console.WriteLine(

"RenewOnCallTime: " + lease.RenewOnCallTime);

 Console.WriteLine(

"SponsorshipTimeout: " + lease.SponsorshipTimeout);

 Console.WriteLine(lease.CurrentLeaseTime);

}

В результате получается следующий вывод в окне клиентской консоли:

Изменение

используемых по умолчанию конфигураций аренды

Сам сервер может изменить используемую по умолчанию конфигурацию аренды для всех удаленных объектов, используя служебный класс

System.Runtime.Remoting.Lifetime.LifetimeServices
:

LifetimeServices.LeaseTime = TimeSpan.FromMinutes(10);

LifetimeServices.RenewOnCallTime = TimeSpan.FromMinutes(2);

Если требуются другие используемые по умолчанию значения параметров времени жизни, в зависимости от типа удаленного объекта, можно изменить конфигурацию аренды удаленного объекта, переопределяя метод

InitializeLifetimeService
базового класса
MarshalByRefObject
:

public class Hello : System.MarshalByRefObject {

 public Hello {

Console.WriteLine("Constructor called");

 }

 ~Hello {

Console.WriteLine("Destructor called");

 }

 public override Object InitializeLifetimeService {

ILease lease = (ILease)base.InitializeLifetimeService;

lеase.InitialLeaseTime = TimeSpan.FromMinutes(10);

lease.RenewOnCallTime = TimeSpan.FromSeconds(40);

return lease;

 }

}

Конфигурация служб времени жизни также задается с помощью конфигурационного файла.

Конфигурационные файлы

Вместо записи конфигурации канала и объекта в исходном коде, можно использовать конфигурационные файлы. Таким способом реконфигурируют канал, добавляют дополнительные каналы и т.д., не изменяя исходный код. Для этого, как и для всех других конфигурационных файлов на платформе .NET. используется XML на основе тех же самых приложений, о которых было написано в главе 10. В те же самые файлы в главе 25 будет добавлена конфигурация системы безопасности. В .NET Remoting имеются атрибуты и элементы XML для конфигурирования канала и удаленных объектов. Файл должен иметь то же самое имя, что и исполнимый файл, за которым следует

.config
. Для сервера
HelloServer.exe
конфигурационным файлом будет
HelloServer.exe.config
. В коде, загружаемом с web-сайта издательства Wrox, можно найти примеры конфигурационных файлов в корневом каталоге примеров с именами
clientactivated.config
,
wellknown.config
и
wellknownhttp.config
. Чтобы воспользоваться ими, переименуйте их, как показано выше, и поместите в каталог, содержащий исполнимый файл.

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

<configuration>

 <system.runtime.remoting>

<application name="Hello">

<service>

<wellknown mode="SingleCall" type="Wrox.ProfessionalCSharp.Hello, RemoteHello" objectUri="Hi" />

</service>

<channels>

<channel type="System.Runtime.Remoting.Channels.Tcp.TcpChannel, System.Runtime.Remoting" port="6791" />

<channel type="System.Runtime.Remoting.Channels.Http.HttpChannel, System.Runtime.Remoting" port="6792" />

</channels>

</application>

 </system.runtime.remoting>

</configuration>

<configuration>
является корневым элементом XML для всех конфигурационных файлов .NET. Все удаленные конфигурации можно найти в подэлементе
<system.runtime.remoting>
.
<application>
является подэлементом
<system.runtime.remoting>
.

Посмотрим на основные элементы и атрибуты в

<system.runtime.remoting>
:

□ В элементе

<application>
определяется имя приложения с помощью атрибута
name
. На серверной стороне это имя сервера, а на клиентской стороне — имя клиентского приложения. Пример серверной конфигурации
<application name="Hellо">
определяет имя удаленного приложения
Hello
, которое используется клиентом как часть URL для доступа к удаленному объекту.

□ На сервере элемент

<service>
используется для определения совокупности удаленных объектов. Он может иметь подэлементы
<wellknown>
и
<activated>
вместе с определенным типом удаленного объекта — well known или client-activated.

□ Клиентской частью элемента

<service>
является
<client>
. Подобно элементу
<service>
он может иметь подэлементы
<wellknown>
и
<activated>
для определения типа удаленного объекта. В отличие от <service> элемент <client> имеет атрибут url для определения URL удаленного объекта.

□ 

<wellknown>
является элементом, который используется на сервере и на клиенте для определения хорошо известных удаленных объектов. Серверная часть выглядит так:

<wellknown mode="SingleCall" type="Wrox.ProfessionalCSharp.Hello, RemoteHello" objectURI="Hi" />

□ В то время как атрибут

mode
может принимать значения
SingleCall
или
Singleton
,
type
является типом удаленного класса, включая пространство имен
Wrox.ProfessionalCSharp.Hello
, за которым следует имя сборки
RemoteHello
. Именем удаленного объекта является
objectURI
, который зарегистрирован в канале. На клиенте атрибут
type
является таким же, как и для серверной версии.
mode
и
objectURI
не нужны, вместо них используется атрибут
url
для определения пути доступа к удаленному объекту: протокол, имя хоста, номер порта, имя приложения и URI объекта:

<wellknown type="Wrox.ProfessionalCSharp.Hello, RemoteHello" url="tcp://localhost:6791/Hello/Hi" />

□ Элемент

<activated>
используется для активированных клиентом объектов. С помощью атрибута
type
должны быть определены тип данных и сборка как для клиентского, так и для серверного приложений:

<activated type="Wrox.ProfessionalCSharp.Hello, RemoteHello" />

□ Для определения канала, используется элемент

<channel>
. Это подэлемент
<channels>
, так что совокупность каналов можно сконфигурировать для одного приложения. Его использование аналогично для клиентов и серверов. Атрибут
type
используется для определения типа канала и сборки. Атрибут
port
является номером порта, который нужен только для серверной конфигурации:

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