Вход/Регистрация
C# для профессионалов. Том II
вернуться

Ватсон Карли

Шрифт:

Приемники сообщений

Метод

Activator.GetObject
вызывает
RemotingServicesConnect
для соединения с хорошо известным объектом. В методе
Connect
происходит
Unmarshal
, где создается не только прокси, но и уполномоченные приемники. Прокси использует цепочку уполномоченных приемников для передачи сообщения в канал. Все приемники являются перехватчиками, которые могут изменять сообщение и выполнять некоторые дополнительные действия, такие как создание блокировки, запись события, выполнение проверки безопасности и т.д.

Все приемники событий реализуют интерфейс

IMessageSink
. Такой интерфейс определяет одно свойство и два метода:

□ Свойство

NextSink
используется приемником для получения следующего приемника и передачи сообщения дальше.

□ Для синхронных сообщений вызывается метод

SyncProcessMessage
предыдущим приемником или удаленной инфраструктурой. Он имеет параметр
IMessage
для отправки и возврата сообщения.

□ Для асинхронных сообщений вызывается метод

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

Рассмотрим три доступных для использования приемника сообщения.

Уполномоченный приемник

Можно получить цепочку уполномоченных приемников с помощью интерфейса

IEnvoyInfo
. Маршализованная объектная ссылка
ObjRef
имеет свойство
EnvoyInfo
, которое возвращает интерфейс
IEnvoyInfo
. Список уполномоченных приемников создается из серверного контекста, поэтому сервер может добавлять функциональность клиенту. Уполномоченные приемники собирают информацию об идентичности клиента и предают ее серверу.

Приемник серверного контекста

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

Объектный приемник

Объектный приемник ассоциируется с определенным объектом. Если объектный класс определяет атрибуты определенного контекста, то для объекта создаются приемники контекста.

Передача объектов в удаленные методы

Типы параметров для вызовов удаленных методов не ограничены только базовыми типами данных, но могут также быть классами, которые определяет программист. Для удаленных методов различают три типа классов:

□ Классы, маршализуемые по значению, обычно сериализуются через канал. Классы, которые должны быть маршализованы, либо реализуют интерфейс

ISerializable
, либо помечаются с помощью атрибута
[Serializable]
. Объекты этих классов не имеют удаленной идентичности, так как весь объект маршализуется через канал, а объект, который сериализуется клиенту, является независимым от серверного объекта (или наоборот). Классы, маршализуемые по значению, называются также несвязанными классами, так как они не имеют данных, которые зависят от домена приложения.

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

MarshalByRefObject
. Объекты
MarshalByRefObject
называют объектами, связанными с доменом приложения. Специализированной версией
MarshalByRefObject
является класс
ContextBoundObject
: абстрактный класс
ContextBoundObject
выводится из
MarshalByRefObject
. Если класс выводится из
ContextBoundObject
, требуется прокси даже в том же самом домене приложения, когда пересекаются границы контекстов.

□ Классы, которые не являются сериализуемыми и не выводятся из

MarshalByRefObject
, не могут использоваться в параметрах открытых методов удаленных объектов. Эти классы связаны с доменом приложения, где они созданы. Такие классы должны использоваться, если класс имеет члены данных, допустимые только в домене приложения, такие как дескриптор файла Win32.

Чтобы увидеть маршализацию в действии, изменим удаленный объект для пересылки двух объектов клиенту: пусть класс

MySerialized
посылает маршализацию по значению, а класс
MyRemote
маршализует по ссылке. В методах сообщение записывается на консоль, чтобы можно было проверять, сделан ли вызов на клиенте или на сервере. Кроме того, класс Hello изменяется, чтобы возвращать экземпляры
MySerilized
и
MyRemote
:

using System;

namespace Wrox.ProfessionalCSharp {

 [Serilizable]

 public сlass MySerilized {

public MySerilized(int val) {

a = val;

}

public void Foo {

Console.WriteLine("MySerialized.Foo called");

}

public int A {

get {

Console.WriteLine("MySerialized A called");

  • Читать дальше
  • 1
  • ...
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: