Активация сервером

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

Объекты, активируемые сервером, — это объекты, время существования которых напрямую контролируется сервером. Домен серверного приложения создает эти объекты только тогда, когда клиент вызывает метод такого объекта, а не когда клиент использует оператор new (New() в Visual Basic) или вызывает метод Activator.GetObject; это позволяет избежать отправки запроса по сети и получения ответа только с целью создания экземпляра. Когда клиент запрашивает экземпляр типа, активируемого сервером, в домене клиентского приложения создается только прокси. Это значит, что для типов, активируемых сервером, можно использовать только конструкторы по умолчанию. Для публикации типа, экземпляры которого будут создаваться с помощью особых конструкторов, принимающих аргументы, должна использоваться Активация клиента или динамическая публикация конкретного экземпляра.

Режимы активации сервером

Имеется два режима активации (или значения WellKnownObjectMode) для активируемых сервером объектов: Singleton и SingleCall.

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

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

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

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

В следующем примере кода показан вызов метода Activator.GetObject в предположении, что канал TcpChannel зарегистрирован для связи через порт 8080. Если клиенту известен только факт, что в серверном объекте реализован определенный интерфейс, необходимо вызывать метод Activator.GetObject, поскольку для создания экземпляра класса можно использовать только оператор new (New в Visual Basic).

Dim MyRemoteClass As RemoteObjectClass = _
   CType( _
      Activator.GetObject(GetType(RemoteObjectClass), _
         "tcp://computername:8080/RemoteObjectUri" ), _
      RemoteObjectClass
   ) 
RemoteObjectClass MyRemoteClass = (RemoteObjectClass)Activator.GetObject(
   typeof(RemoteObjectClass),
   "tcp://computername:8080/RemoteObjectUri "
);

Следует помнить, что на данном этапе никакого взаимодействия с сервером не происходит и удаленный объект не создается. Создается только экземпляр прокси-объекта на стороне клиента. Теперь клиент может использовать объект MyRemoteClass, как если бы у него была прямая ссылка на удаленный объект. Экземпляр RemoteObjectClass, который клиент фактически использует для взаимодействия при различных вызовах методов, зависит от того, к какому типу относится серверный объект — Singleton или SingleCall. Независимо от того, раскрывает ли эту информацию издатель серверного объекта, клиент использует имеющуюся у него ссылку на объект совершенно одинаково.

Объекты Singleton

В модели COM тип "singleton" означал, что объект хранится в памяти, пока у клиентов имеются ссылки на этот объект. Однако в системе удаленного взаимодействия .NET на объекты Singleton распространяется действие заданного для них времени аренды, поэтому такие объекты могут быть уничтожены, даже если у клиентов еще имеются ссылки на них. Можно создать объект типа Singleton, соответствующий старым правилам, переопределив метод InitializeLifetimeService класса MarshalByRefObject таким образом, чтобы он возвращал пустую ссылку (Nothing в Visual Basic). В результате объект будет оставаться в памяти, пока существует домен основного приложения. Дополнительные сведения см. в разделе Аренда времени существования. Объект Singleton последнего типа можно создать, настроив время начальной аренды в файле конфигурации удаленного взаимодействия.

См. также

Справочник

WellKnownObjectMode Enumeration

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

Активация удаленных объектов
Активация клиента
Аренда времени существования