ChannelPriority — только для чтения с условием, что более одного канала используется для коммуникации между клиентом и сервером. Приоритет определяет порядок каналов. На клиенте канал с более высоким приоритетом выбирается первым для соединения с сервером.

В зависимости от того, является ли канал клиентским каналом или серверным каналом, реализуются дополнительные интерфейсы. Серверные версии каналов реализуют интерфейс IChannelReceiver, клиентские версии — интерфейс IChannelSender.

Классы HttpChannel и TcpChannel используются как для клиентов, так и для серверов. Они реализуют IChannelSender и IChannelReceiver. Эти интерфейсы являются производными из IChannel.

IChannelSender клиентской стороны имеет в дополнение в IChannel единственный метод, называемый CreateMessageSink(), который возвращает объект, реализующий IMessageSink. Интерфейс IMessageSink применяется для размещения синхронных, а также асинхронных сообщений в канале. С помощью интерфейса серверной стороны IChannelReceiver канал можно перевести в режим прослушивания с помощью метода StartListening() и снова остановить с помощью метода StopListening(). Также имеется свойство для доступа к полученным данным.

Информацию о конфигурации обоих каналов получают с помощью свойств классов каналов ChannelName, ChannelPriority и ChannelData. С помощью свойства ChannelData получают информацию об URI, который хранится в классе ChannelDataStore. В классе HttpChannel имеется также свойство Scheme. Ниже представлен вспомогательный метод ShowChannelProperties(), демонстрирующий эти данные.

protected static void ShowChannelProperties(IChannelReceiver channel) {

 Console.WriteLine('Name; ' + channel.ChannelName');

 Console.WriteLine('Priority: ' + channel.ChannelPriority);

 if (channel is HttpChannel) {

  HttpChannel httpChannel = channel as HttpChannel;

  Console.WriteLine('Scheme: ' + httpChannel.ChannelScheme);

 }

 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) и номер порта.

Задание свойств канала

Можно задать все свойства канала в списке с помощью конструктора TcpServerChannel (IDictionary, IServerChannelSinkProvider). Класс ListDictionary реализует IDictionary, поэтому свойства Name, Priority и Port задаются с помощью этого класса.

Для использования класса ListDictionary необходимо объявить использование пространства имен 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 предоставляет два класса форматтера:

System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

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

Отметить Добавить цитату