Объекты, поддерживающие и не поддерживающие удаленное взаимодействие

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

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

Объекты, не поддерживающие удаленное взаимодействие

Некоторые объекты не могут использоваться за пределами своего домена приложения; они никогда не маршалируются, поскольку для них не объявлен метод сериализации. Эти не поддерживающие удаленное взаимодействие объекты предназначены для использования в домене приложения, в котором они были созданы, и доступ к ним всегда осуществляется напрямую из этого домена. Большинство базовых классов в библиотеке классов .NET Framework не поддерживают удаленное взаимодействие. Объекты, не поддерживающие удаленное взаимодействие, нельзя скопировать или представить в другом домене приложения. Эти объекты доступны только из своего домена приложения.

Объекты, поддерживающие удаленное взаимодействие

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

Объекты, поддерживающие удаленное взаимодействие, — это объекты, которые функционируют в среде с высокой степенью распределенности. Имеется две основных разновидности объектов, поддерживающих удаленное взаимодействие:

  • объекты, маршалируемые по значению, которые копируются и передаются за пределы домена приложения;

  • объекты, маршалируемые по ссылке, для которых создается прокси-объект, используемый клиентом для удаленного доступа к объектам.

Объекты, маршалируемые по значению

Объекты, маршалируемые по значению (MBV) объявляют свои правила сериализации (путем реализации интерфейса ISerializable для реализации собственного порядка сериализации или с помощью пометки атрибутом SerializableAttribute, который указывает системе сериализовать объект автоматически), но не расширяют класс MarshalByRefObject. Система удаленного взаимодействия создает полную копию таких объектов и передает эту копию в домен вызывающего приложения. Когда копия достигает домена вызывающего приложения, все вызовы передаются непосредственно в эту копию. Более того, MBV-объекты, передаваемый в качестве аргументов, также передаются по значению. Помимо объявления атрибута SerializableAttribute или реализации интерфейса ISerializable не нужно ничего делать, чтобы передавать экземпляры класса по значению за пределы границ приложения или контекста.

h8f0y3fc.note(ru-ru,VS.100).gifПримечание
Начиная с .NET Framework версии 1.1 инфраструктура удаленного взаимодействия не выполняет автоматическую десериализацию определенных типов на сервере. Если приложение пытается передать тип, который автоматически не сериализуется, чтобы сервер смог десериализовать и использовать MBV-объект, необходимо установить на сервере уровень десериализации Full. Дополнительные сведения см. в разделе Автоматическая десериализация при удаленном взаимодействии .NET.

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

Используйте для создания маршалируемого по значению типа атрибут SerializableAttribute, если только не происходит расширение класса, который уже реализует интерфейс ISerializable. В последнем случае необходимо реализовать для типа интерфейс ISerializable.

Система удаленного взаимодействия активно использует сериализуемые объекты. Ссылку на объект в другом домене приложения, представляемую в системе удаленного взаимодействия классом ObjRef, также можно сериализовать; должна существовать возможность в точности скопировать ее и переслать копию клиенту. Кроме того, сериализуемыми объектами часто являются объекты, передающие данные. Например, класс DataSet расширяет класс MarshalByValueComponent, который реализует интерфейс ISerializable.

Пользовательские исключения в среде удаленного взаимодействия

Все системные исключения относятся к маршалируемым по значению типам (они реализуют интерфейс ISerializable); когда такое исключение создается удаленным объектом, оно автоматически копируется для вызывающего объекта, если это разрешено конфигурацией удаленного взаимодействия. Начиная с .NET Framework версии 1.1, для разрешения передачи исключений вызывающему объекту необходимо установить элемент <customErrors> в значение off.

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

Объекты, маршалируемые по ссылке

Объекты, маршалируемые по ссылке, (MBR) — это поддерживающие удаленное взаимодействие объекты, которые являются расширением по крайней мере класса System.MarshalByRefObject. В зависимости от объявленного типа активации, когда клиент создает в собственном домене приложения экземпляр MBR-объекта, инфраструктура удаленного взаимодействия .NET создает прокси-объект, который представляет MBR-объект, и возвращает вызывающей стороне ссылку на этот прокси-объект. После этого клиент обращается с вызовами к прокси-объекту. Система удаленного взаимодействия .NET маршалирует эти вызовы в домен приложения удаленного объекта и выполняет вызов.

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

Если объект System.MarshalByRefObject передается в качестве параметра, после получения вызова он становится прокси-объектом в другом домене приложения. Это же относится к возвращаемым значениями и параметрам out MBR.

h8f0y3fc.note(ru-ru,VS.100).gifПримечание
Начиная с .NET Framework версии 1.1 инфраструктура удаленного взаимодействия .NET не выполняет автоматическую десериализацию определенных типов на сервере. Например, чтобы включить поддержку MBR-объектов, передаваемых в качестве параметров, необходимо установить на сервере уровень десериализации равным Full, прежде чем сервер сможет десериализовывать и использовать MBR-параметры. Дополнительные сведения см. в разделе Автоматическая десериализация при удаленном взаимодействии .NET.

MBR-объекты следует использовать в случаях, когда состояние объекта и выполняемые функции должны оставаться в домене приложения, в котором был создан данный объект. Например, объект, имеющий внутреннее поле, которое является маркером операционной системы, должен быть расширением класса System.MarshalByRefObject, поскольку маркер операционной системы не будет иметь смысла в другом домене приложения, другом процессе или на другом компьютере. В некоторых случаях объект может быть очень большим; его можно использовать на надежном сервере, но не передавать через модем со скоростью 33,6 Кбит/с.

Контекстно-привязанные объекты

Контекстно-привязанные объекты — это MBR-объекты, наследующие классу System.ContextBoundObject, который сам является наследником класса System.MarshalByRefObject. Контекст можно рассматривать в качестве части домена приложения, обеспечивающей расширенные функции для находящихся в ней объектов во время выполнения. Например, контекст может гарантировать, что несколько потоков не будут обращаться к объектам одновременно. У каждого домена приложения имеется контекст по умолчанию. Чаще всего управляемый код создает объекты и вызывает члены непосредственно из того же домена приложения, используя контекст домена по умолчанию; при этом никаких проблем, связанных с контекстами, не возникает. Все типы, наследующие классу System.ContextBoundObject, доступны в других контекстах (в том же или другом домене) в качестве прокси-объектов.

Предположим, имеется метод типа, который является частью транзакции, а следовательно ограничен правилами контекста, в котором он был создан. Этот тип должен наследовать от класса System.ContextBoundObject, чтобы объект был доступен из своего контекста, а система может применять правила в зависимости от транзакций, связанных с этим объектом и его методами. Если объект System.ContextBoundObject вызывается из другого контекста в том же домене приложения, для вызывающего объекта создается прокси-объект, но межконтекстное взаимодействие не задействует систему каналов, что повышает эффективность вызовов в такой ситуации.

Поскольку пересечение каждой из границ требует времени на обработку, прежде чем принять решение о том, к какому типу объектов, поддерживающих удаленное взаимодействие, должен относиться сервер, необходимо определить, какие границы должен пересекать объект. Объекты, относящиеся к конкретному контексту, доступны напрямую только из этого контекста. То же самое относится и к объектам, которые расположены в конкретном домене приложения. Чтобы серверный объект можно было вызвать удаленно, система удаленного взаимодействия должна поддерживать обращение через границу контекста, границу приложения или через обе границы. Если при вызове объекта проверять контекст не требуется, не следует делать удаленный тип расширением класса System.ContextBoundObject; класс System.MarshalByRefObject работает более эффективно. Если проверка контекста все же требуется, следует использовать расширения класса System.ContextBoundObject, однако при этом необходимо понимать, что при вызове объекта придется пересекать дополнительную границу.

Область публикации

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

  • Статические члены.

    Статические поля и методы никогда не могут быть удаленными, а доступ к полям осуществляется непосредственно через память. Это значит, что система удаленного взаимодействия .NET всегда имеет дело с членами экземпляров.

  • Поля и методы доступа экземпляра.

    В случае полей и методов доступа экземпляра система использует во время выполнения проверку, чтобы определить, является ли объект прокси-объектом. Если объект не является прокси-объектом, доступ к полю осуществляется напрямую. В противном случае методы доступа предоставляются вызывающему объекту прокси-объектом.

  • Закрытые методы.

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

  • Делегаты.

    Делегаты являются объектами, маршалируемыми по значению. Объект внутри делегата может относиться к любому типу поддерживающих удаленное взаимодействие объектов — сериализуемый объект, объект MarshalByRefObject или объект ContextBoundObject. Единственное исключение — невозможно удаленно использовать делегат на метод интерфейса. Делегат создает оболочку для реализации метода интерфейса, что требует доступности на сервере информации о типе клиента.

  • Переопределение методов объекта.

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

    • Equals

      Этот виртуальный метод выполняется удаленно, если он переопределен.

    • GetHashCode

      Этот метод выполняется локально.

    • ToString

      Этот виртуальный метод выполняется удаленно, если он переопределен.

    • Equals (статическая версия)

      Этот метод выполняется локально.

    • MemberwiseClone

      Этот метод выполняется локально.

См. также

Задачи

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

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

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