Поиск секций во время активации
Поиск правильной секции, в которой необходимо активировать компонент, зависит от следующего:
- Вызов функции и параметры, используемые в вызывающей программе для активации компонента
- Указывает, является ли активируемый компонент локальным или удаленным
- Внутреннее использование кэша секций
Вызываемая программа
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+ использует для поиска секции для активации компонента.
Размер кэша и время окончания срока действия записей кэша задаются с помощью разделов реестра. Дополнительные сведения о настройке этих разделов реестра см. в разделе "Создание и настройка секций COM+".
Примечание.
Если серверный компьютер отключен от сети и сопоставление между пользователями изменяется во время отключения сервера, кэш секций может содержать устаревшее сопоставление между секциями. Это может привести к ошибке активации, если сопоставление между пользователями является механизмом, используемым для активации компонента.