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


Распространение ИД действия

Распространение происходит при включении трассировки действий ServiceModel (распространение ServiceModel) или ее выключении (распространение действий от пользователя к пользователю).

Трассировка действий ServiceModel включена

Если трассировка действий ServiceModel включена, между действиями ProcessAction осуществляется распространение.

Сервер

propagateActivity Если атрибут задан true как на клиенте, так и на сервере, идентификатор ProcessAction действия на сервере идентичен идентификатору в заголовке распространяемого ActivityId сообщения.

ActivityId Если в сообщении отсутствует заголовок (то propagateActivity=false есть на клиенте) или когда propagateActivity=false на сервере, сервер создает новый идентификатор действия.

Клиент

Если клиент синхронно однопоточный, он игнорирует любые параметры propagateActivity на уровне клиента или сервера. Вместо этого ответ обрабатывается действием запроса. Если клиент имеет асинхронную или синхронную многопоточность, propagateActivity=true в клиенте есть заголовок идентификатора действия, отправляемого сервером, клиент получает идентификатор действия из сообщения и передает его в действие "Действие процесса", содержащее идентификатор распространяемого действия. Иначе клиент передает его из действия Process Action в новое действие Process Action. Такая дополнительная передача в новое действие Process Action осуществляется для обеспечения согласованности. В этом действии клиент извлекает идентификатор действия BeginCall из контекста локального потока, когда выделяется поток для обработки ответного сообщения. После этого осуществляется передача в первоначальное действие Process Action.

Если клиент дуплексный, он действует в качестве сервера для получения сообщения.

Распространение в сообщениях об ошибках

Разницы в обработке допустимых сообщений и сообщений об ошибках нет. Если propagateActivity=trueидентификатор действия, добавленный в заголовки сообщений об ошибке SOAP, идентичен внешнему действию.

Трассировка действий ServiceModel отключена

Если трассировка действий ServiceModel отключена, распространение осуществляется непосредственно между действиями пользовательского кода, минуя действия ServiceModel. Идентификатор пользовательского действия также распространяется через заголовок идентификатора действия сообщения.

Если propagateActivity=true и ActivityTracing=off для прослушивателя трассировки ServiceModel (независимо от того, включена ли трассировка в ServiceModel), на клиенте или сервере происходит следующее:

  • При запросе операции или отправке ответа идентификатор действия в TLS распространяется из пользовательского кода, пока не будет сформировано сообщение. Заголовок идентификатора действия также вставляется в сообщение перед отправкой.

  • При получении запроса или ответа идентификатор действия извлекается из заголовка сообщения сразу после создания объекта полученного сообщения. Идентификатор действия в TLS распространяется сразу после исчезновения сообщения из области, пока не будет достигнут пользовательский код.

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

Как правило, трассировки ServiceModel находятся в следующих местах.

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

  • Если включена трассировка ServiceModel, но ActivityTracing отключена, пользовательские трассировки находятся в том же действии, если для обеих сторон включено распространение. Трассировки ServiceModel появляются в действии по умолчанию 0000, пока они не возникнут в том же потоке, где выполняется обработка пользовательского кода с первоначально заданным действием.

  • Если включены трассировка ServiceModel и ActivityTracing, пользовательские трассировки находятся в пользовательских действиях, а трассировка ServiceModel - в действиях, определенных ServiceModel. Распространение осуществляется на уровне ServiceModel.