}
Конфигурация служб времени жизни также задается с помощью конфигурационного файла.
Конфигурационные файлы
Вместо записи конфигурации канала и объекта в исходном коде, можно использовать конфигурационные файлы. Таким способом реконфигурируют канал, добавляют дополнительные каналы и т.д., не изменяя исходный код. Для этого, как и для всех других конфигурационных файлов на платформе .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>
вместе с определенным типом удаленного объекта —
□ Клиентской частью элемента <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
является номером порта, который нужен только для серверной конфигурации:
<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>
Конфигурация сервера для хорошо известных объектов
Этот пример файла wellknown.config
имеет значение Hello
для свойства Name
. Мы используем канал TCP для прослушивания порта 6791, а канал HTTP для прослушивания порта 6792. Класс удаленного объекта —Wrox.ProfessionalCSharp.Hello
в сборке RemoteHello.dll
, объект в канале называется Hi
, и используется режим SingleCall
:
<configuration>
<system.runtime.remoting>