Поделиться через


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

Поиск правильной секции, в которой необходимо активировать компонент, зависит от следующего:

  • Вызов функции и параметры, используемые в вызывающей программе для активации компонента
  • Указывает, является ли активируемый компонент локальным или удаленным
  • Внутреннее использование кэша секций

Вызываемая программа

COM+ выбирает секцию для активации компонентов в зависимости от того, как вызываемая программа активирует компонент.

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

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

Вызов функции Параметр Действие COM+
CoGetObject или GetObject
Моникер секции (включает идентификатор секции и CLSID)
Использует идентификатор секции, указанный в моникере секции.
CoCreateInstance
CLSID
Использует идентификатор секции секции по умолчанию удостоверения пользователя или идентификатор секции, добавленный в контекст во время активации предыдущего компонента в том же процессе.

Действия COM+, перечисленные в предыдущей таблице, описаны в следующих разделах.

Использование моникеров секций

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

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

HRESULT CoGetObject(
  L"partition:partitionGUID/new:clsid",
  pBindOptions,
  IID_IUnknown,
  (void**)&pIUnknown);

В следующем примере показан фрагмент кода C++, в котором моникер секции используется в качестве аргумента функции CoGetObject :

// Create CLSID1 configured in the Production partition.
HRESULT hr = CoGetObject(
  L"partition:{35056070-D5B7-4b59-9FBF-0D23417F6937}/new:CLSID1",
  pBindOptions, IID_IUnknown, (void**)&pIUnknown);

В коде Visual Basic синтаксис моникера секции выглядит следующим образом:

GetObject("partition:partitionGUID/new:CLSID") As Object

В следующем примере показан фрагмент кода Visual Basic, в котором моникер секции используется в качестве аргумента функции GetObject :

Dim objCLSID1 As Object
Set objCLSID1 = GetObject( _
   "partition:{35056070-D5B7-4b59-9FBF-0D23417F6937}/new:CLSID1")

Использование сопоставления по умолчанию

Если функция CoCreateInstance используется для активации компонента с помощью CLSID компонента, COM+ использует сопоставление удостоверений пользователя по умолчанию, то есть набор секций, с которым сопоставляется пользователь в Active Directory. Однако если пользователь не сопоставлен с набором секций в Active Directory, выбран глобальный раздел.

Использование идентификаторов секций и контекста объектов

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

Дополнительные сведения о поиске секций во время активации см. в разделе COM+ Queued Components and Partitions.

Локальная и удаленная активация

  • Если вызываемый компонент существует на другом компьютере, свойства секции (включая идентификатор секции) маршалируются на другой компьютер, а компонент активируется из маршалированного раздела. Если идентификатор секции не был маршалирован, COM+ использует набор секций по умолчанию, сопоставленный с удостоверением пользователя в Active Directory.

Кэш секций

В среде домена COM+ использует сопоставления в Active Directory, чтобы найти правильную секцию для активации компонента. Однако частые поиски в Active Directory могут привести к чрезмерному сетевому трафику. Чтобы свести к минимуму сетевой трафик, вызванный частым поиском сопоставления между секциями в Active Directory, COM+ использует кэш секций.

Кэш секций содержит сопоставления, которые были сделаны в Active Directory между удостоверениями пользователей или подразделениями и их наборами секций. Этот кэш секций расположен на сервере приложений, на котором находятся приложения COM+.

Если com+ должен определить секцию по умолчанию пользователя или проверить права доступа пользователя к секции, он проверка кэш секции локально для поиска сопоставления пользователя, а не проверка удаленного доступа Active Directory.

Если поиск в кэше секций завершается ошибкой, COM+ проверка s Active Directory. Если поиск выполнен успешно в Active Directory, COM+ сохраняет сопоставление в кэше секций. При следующем поиске для сопоставления пользователей и секционирования COM+ найдет его в кэше секций.

На следующем рисунке показан процесс, который COM+ использует для поиска секции для активации компонента.

Diagram that shows a troubleshooting tree for the process that COM+ uses to locate a partition for component activation.

Размер кэша и время окончания срока действия записей кэша задаются с помощью разделов реестра. Дополнительные сведения о настройке этих разделов реестра см. в разделе "Создание и настройка секций COM+".

Примечание.

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

Поиск компонента для активации