ChannelDataStore data = (ChannelDataStore)channel.ChannelData;
foreach (string uri in data.ChannelUris) {
Console.WriteLine("URI: " + uri);
}
Console.WriteLine;
}
После
создания каналов вызывается метод
ShowChannelProperties
:
TcpServerChannel tcpChannel = new TcpServerChannel(8086);
ShowChannelProperties(tcpChannel);
HttpServerChannel httpChannel = new HttpServerChannel(8085);
ShowChannelProperties(httpChannel);
С помощью каналов TCP и HTTP будет получена следующая информация:
Как можно видеть, именем по умолчанию для
TcpServerChannel
будет
tcp
, а канал HTTP называется
http
. Оба канала имеют свойство по умолчанию, равное 1 (в конструкторах заданы порты 8085 и 8086). URI каналов показывает протокол, имя хоста (в данном случае
CNagel
) и номер порта.
Задание свойств канала
Можно задать все свойства канала в списке с помощью конструктора
необходимо объявить использование пространства имен
System.Collections.Specialized
. В дополнение к параметру
IDictionary
передается параметр
IServerChannelSinkProvider
, в данном случае
SoapServerFormatterSinkProvider
вместо
BinaryServerFormatterSinkProvider
, который используется по умолчанию для
TCPServerChannel
. Реализация по умолчанию класса
SoapServerFormatterSinkProvider
ассоциирует класс
SoapServerFormatterSink
с каналом, применяющим
SoapFormatter
для преобразования данных передачи:
ListDictionary properties = new ListDictionary;
properties.Add("Name", "TCP Channel with a SOAP Formatter");
properties.Add("Priority", "20");
properties.Add("Port", "8086");
SoapServerFormatterSinkProvider sinkProvider =
new SoapServerFormatterSinkProvider;
TcpServerChannel tcpChannel =
new TcpServerChannel(properties.sinkProvider);
ShowChannelProperties(tcpChannel);
Вывод,
который будет получен из запускаемого на сервере кода, показывает новые свойства канала TCP:
Подключаемость канала
Можно создать специальный канал для отправки сообщений с помощью транспортного протокола, отличного от HTTP или TCP, или расширить существующие каналы:
□ Посылающая часть должна реализовать интерфейс
IChannelSender
. Наиболее важным является метод
CreateMessageSink
, где клиент посылает URL, с помощью него создается экземпляр соединения с сервером. Здесь должен быть создан приемник сообщений, затем он используется прокси для отправки сообщений в канал.
□ Получающая часть должна реализовать интерфейс
IChannelReceiver
. Необходимо запустить прослушивание с помощью свойства
ChannelData
, затем ожидать отдельного потока выполнения для получения данных от клиента. После демаршализации сообщения метод
ChannelServices.SyncDispatchMessage
может использоваться для отправки сообщения объекту.
Форматтеры
.NET Framework предоставляет два класса форматтера:
Форматтер является подключаемым. При создании класса собственного форматтера экземпляр должен ассоциироваться с используемым каналом. Это делается с помощью приемника форматтера и провайдера приемника форматтера. Как было показано ранее, провайдер источника форматтера, например
SoapServerFormatterSinkProvider
, может передаваться как аргумент при создании канала. Провайдер источника форматтера реализует для сервера интерфейс
IServerChannelSinkProvider
, а для клиента
IClientChannelSinkProvider
. Оба эти интерфейса определяют метод
CreateSink
, возвращающий источник форматтера, —
SoapServerFormatterSinkProvider
даст экземпляр класса
SoapServerFormatterSink
. На клиентской стороне имеется класс
SoapClientFormatterSink
, который использует в методах
SyncProcessMessage
и
AsyncProcessMessage
класс
SoapFormatter
для сериализации сообщения.
SoapServerFormatterSink
десериализует сообщение снова с помощью
SoapFormatter
.
Все эти классы приемника и провайдера способны расширяться и заменяться собственными реализациями.
ChannelServices и RemotingContiguration
Служебный класс
ChannelServices
используется для регистрации каналов в среде выполнения .NET Remoting. С помощью этого класса можно также получить доступ ко всем зарегистрированным каналам. Это крайне полезно, если для конфигурирования канала используются конфигурационные файлы, так как в этом случае канал создается неявно (см. ниже).