Сведения о версии при удаленном взаимодействии

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

Удаленное взаимодействие предназначено для работы со сборками со строгими именами. Если при удаленном взаимодействии используются строгие имена, действуют следующие базовые правила:

  • версии всегда указываются в свойстве TypeName реализации интерфейса IMethodCallMessage;

  • версии всегда указываются в свойстве ActivationTypeName реализации интерфейса IConstructionCallMessage;

  • версии всегда указываются в свойстве TypeInfo, хранящемся в объектах ObjRef;

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

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

Объекты, активируемые сервером

Сервер определяет, какая версия типа будет активирована при подключении клиента к объекту, активируемому сервером (<wellknown>). Если при настройке службы не указываются сведения о версии, при активации объекта используется самая поздняя версия сборки. Например, если имеется две сборки, MyHello версии 1.0.0.0 и MyHello версии 2.0.0.0, при отсутствии сведений о версиях хорошо известный объект будет активирован с использованием сборки версии 2.0. Важно отметить, что эта версия будет использоваться независимо от версии, использовавшейся при построении клиента.

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

<configuration>
<system.runtime.remoting>
   <application name="RemotingHello">
      <lifetime 
         leaseTime="20ms" 
         sponsorshipTimeOut="20ms"
         renewOnCallTime="20ms" 
      />
      <service>
         <wellknown 
            mode="SingleCall" 
            type="Hello.HelloService,MyHello,Version=1.0.0.0,<strong name omitted>"
            objectUri="HelloService.soap" 
         />
         <activated 
            type="Hello.AddService, MyHello"
         />
      </service>
      <channels>
         <channel 
            port="8000"
            ref="tcp"
         >
         </channel>
      </channels>
   </application>
</system.runtime.remoting>
</configuration>

Файл указывает, что при создании объектов для клиентов должна использоваться версия 1.0.0.0 сборки MyHello. Если в конечной точке задано более одной версии одного и того же объекта, при активации объекта будет использоваться последняя заданная версия. Важно помнить, что в случае значительных различий между версиями одного объекта у клиентов могут возникнуть неблагоприятные последствия. Если в новой версии был добавлен или изменен какой-либо параметр, клиенты, скомпилированные с версией 1.0 создадут исключение при использовании с версией 2.0. Поэтому при внесении значительных изменений в объекты рекомендуется размещать их новые версии в другой конечной точке.

Объекты, активируемые клиентом

Когда клиент активирует активируемый клиентом объект (<activated>), серверу отправляется сетевой вызов, в котором активируется запрашиваемый объект, а клиенту возвращается ссылка на этот объект. Поскольку клиент управляет активацией объекта, он также выбирает версию объекта, которая должна быть активирована. Например, если построение клиента было выполнено с использованием версии 1.0, на сервере будет активирована версия 1.0 объекта HelloService, а если построение клиента было выполнено с использованием версии 2.0, то на сервере будет активирована версия 2.0 объекта HelloService.

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

Предположим, например, что типы, активируемые клиентом и сервером, находятся в одной сборке, и построение клиента client1 было выполнено с использованием версии 1.0, а клиента client2 — с использованием версии 2.0. Если версия объекта, активируемого сервером, не задана, то клиент client1 получает версию 2.0 этого объекта и версию 1.0 объекта, активируемого клиентом. Клиент client2 получает версию 2.0 как для хорошо известного, так и для активируемого типа.

Если служба настроена на использование версии 1.0 сборки с хорошо известным объектом, оба клиента получат версию 1.0 хорошо известного объекта, но клиент client1 получит версию 1.0 активируемого типа, а клиент client2 — версию 2.0 активируемого типа.

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

Ссылки на объекты

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

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

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

<formatter ref="soap" includeVersions="true" />

См. также

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

Конфигурация удаленных приложений
Активация клиента
Активация сервером

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

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