Каналы

Этот раздел относится к технологии прежних версий, которая сохраняется для обеспечения обратной совместимости с существующими приложениями и не рекомендуется для разработки новых приложений. Сейчас распределенные приложения следует создавать с помощью  Windows Communication Foundation (WCF).

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

Каналы должны реализовывать интерфейс IChannel, который содержит такие информационные свойства, как ChannelName и ChannelPriority. Каналы, предназначенные для ожидания передачи данных по заданному протоколу через заданный порт, реализуют интерфейс IChannelReceiver, а каналы, предназначенные для передачи данных реализуют интерфейс IChannelSender. Объекты TcpChannel и HttpChannel реализуют оба этих интерфейса, поэтому они могут как отправлять, так и принимать данные.

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

  • при публикации объекта, поддерживающего удаленное взаимодействие, перед регистрацией серверного объекта вызовите метод ChannelServices.RegisterChannel;

  • при использовании функциональности объекта, поддерживающего удаленное взаимодействие, перед созданием экземпляра серверного объекта вызовите метод RegisterChannel.

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

На стороне клиента сообщения передаются в клиентскую цепочку приемников канала после прохода через цепочку клиентских контекстов. Обычно первым приемником канала является приемник модуля форматирования, который сериализует сообщения в поток, передаваемый далее по цепочке приемников канала до транспортного приемника клиента. Затем транспортный приемник клиента передает этот поток по внешним каналам связи.

На стороне сервера серверный транспортный приемник считывает запросы из каналов связи и передает поток запросов в серверную цепочку приемников канала. В конце этой цепочки серверный приемник модуля форматирования десериализует запрос в сообщение. Затем он передает это сообщение в инфраструктуру удаленного взаимодействия. Дополнительные сведения о приемниках каналов см. в разделе Приемники и цепочки приемников.

Правила каналов

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

  • Перед вызовом удаленного объекта в системе удаленного взаимодействия на сервере должен быть зарегистрирован по крайней мере один канал. Каналы должны регистрироваться до регистрации объектов. Если канал не зарегистрирован на клиенте, система удаленного взаимодействия сама выбирает или создает канал для отправки исходящих вызовов.

    dkfd3wha.note(ru-ru,VS.100).gifПримечание
    Если клиент ожидает функции обратного вызова, на клиенте должен быть зарегистрирован ожидающий передачи данных канал, а сервер должен быть настроен на использование совместимого канала.

  • Каналы регистрируются на уровне доменов приложений. Один процесс может содержать несколько доменов приложений. После завершения процесса все зарегистрированные им каналы автоматически уничтожаются.

  • Имена каналов должны быть уникальными в пределах одного домена приложения. Например, поскольку каналы по умолчанию имеют имена, для регистрации двух каналов HttpChannel в одном домене приложения необходимо изменить имена каналов перед их регистрацией. Это продемонстрировано в следующем примере кода C#.

    IDictionary prop = new Hashtable();
    prop["name"] = "http1";
    prop["port"] = "9001";
    ChannelServices.RegisterChannel(new HttpChannel(prop, null, null));
    
  • Нельзя более одного раза зарегистрировать канал, ожидающий передачи данных через определенный порт. Даже если каналы регистрируются на уровне доменов приложений, в двух различных доменах приложений на одном компьютере нельзя зарегистрировать один и тот же канал, который бы ожидал передачи данных через один и тот же порт.

  • Если точных данных о доступности порта нет, при настройке порта канала следует использовать номер 0 (ноль), и система удаленного взаимодействия сама выберет доступный порт.

  • Клиенты могу взаимодействовать с удаленным объектом с помощью любого зарегистрированного канала. Система удаленного взаимодействия следит за тем, чтобы при попытке клиента подключиться к удаленному объекту этот объект подключался через нужный канал. Клиент отвечает за вызов метода ChannelServices.RegisterChannel, перед тем как предпринимать попытку взаимодействия с удаленным объектом. Если клиент ожидает функции удаленного вызова, он должен зарегистрировать канал и порт.

Когда клиент вызывает метод прокси-объекта, вызов перехватывается, помещается в сообщение и передается экземпляру класса RealProxy. Класс RealProxy перенаправляет сообщение приемнику сообщений для обработки. Приемник сообщений устанавливает подключение к каналу, зарегистрированному удаленным объектом, и передает сообщение по каналу в исходный домен приложения. Там сообщение демаршалируется, и осуществляется вызов непосредственно удаленного объекта.

Когда система удаленного взаимодействия инициализирует прокси для удаленного объекта в клиентском домене, с помощью метода IChannelSender.CreateMessageSink настроенного клиентом канала из этого канала извлекается приемник сообщений, позволяющий взаимодействовать с удаленным объектом.

Один из неоднозначных моментов работы системы удаленного взаимодействия связан с отношениями между удаленными объектами и каналами. Например, как удаленный объект WellKnownObjectMode.SingleCall может ожидать подключения клиентов, если этот объект активируется только при получении вызова.

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

См. также

Справочник

HttpChannel
TcpChannel

Основные понятия

Выбор канала
Модули форматирования при сериализации
Приемники и цепочки приемников

Другие ресурсы

Общие сведения о средствах удаленного взаимодействия платформы .NET Framework