伝達は、ServiceModel アクティビティ トレースが有効 (ServiceModel 伝達) または無効 (ユーザー間アクティビティの伝達) に発生します。
ServiceModel アクティビティ トレースが有効になっている
ServiceModel ActivityTracing が有効になっている場合、ProcessAction アクティビティ間で伝達が行われます。
サーバー
propagateActivity
属性がクライアントとサーバーの両方でtrue
に設定されている場合、サーバー内のProcessAction
アクティビティの ID は、伝達されたActivityId
メッセージ ヘッダーの ID と同じです。
メッセージに ActivityId
ヘッダーがない場合 (つまり、クライアント上の propagateActivity
=false
)、またはサーバーで propagateActivity
=false
すると、サーバーは新しいアクティビティ ID を生成します。
顧客
クライアントが同期的にシングル スレッドの場合、クライアントはクライアントまたはサーバーで propagateActivity
の設定を無視します。 代わりに、応答は要求アクティビティで処理されます。 クライアントが非同期または同期マルチスレッドで、クライアントで propagateActivity
=true
し、サーバーによって送信されたメッセージにアクティビティ ID ヘッダーがある場合、クライアントはメッセージからアクティビティ ID を取得し、伝達されたアクティビティ ID を含むプロセス アクション アクティビティに転送します。 それ以外の場合、クライアントはプロセス メッセージ アクティビティから新しいプロセス アクション アクティビティに転送します。 この新しいプロセス アクション アクティビティへの追加の転送は、一貫性のために行われます。 このアクティビティ内では、クライアントは、応答メッセージ処理用にスレッドが割り当てられているときに、ローカル スレッド コンテキストから BeginCall アクティビティのアクティビティ ID を取得します。 その後、最初のプロセス アクション アクティビティに転送されます。
クライアントが双方向の場合、クライアントはメッセージの受信時にサーバーとして機能します。
障害メッセージの拡散
有効なメッセージとエラー メッセージの処理に違いはありません。
propagateActivity
=
true
場合、SOAP エラー メッセージ ヘッダーに追加されるアクティビティ ID はアンビエント アクティビティと同じです。
ServiceModel アクティビティ トレースが無効になっている
ServiceModel ActivityTracing が無効になっている場合、ServiceModel アクティビティを経由することなく、ユーザー コード アクティビティ間で直接伝達が行われます。 ユーザー定義のアクティビティ ID も、メッセージ アクティビティ ID ヘッダーを介して伝達されます。
ServiceModel トレース リスナーの propagateActivity
=true
と ActivityTracing
=off
場合 (ServiceModel でトレースが有効になっているかどうかに関係なく)、クライアントまたはサーバーで次のことが行われます。
操作要求または応答の送信時に、TLS のアクティビティ ID は、メッセージが形成されるまでユーザー コードから伝達されます。 アクティビティ ID ヘッダーも、送信前にメッセージに挿入されます。
要求の受信時または応答の受信時に、受信したメッセージ オブジェクトが作成されるとすぐに、アクティビティ ID がメッセージ ヘッダーから取得されます。 TLS のアクティビティ ID は、ユーザー コードに達するまで、メッセージがスコープから消えたらすぐに伝達されます。
このアクションによって、伝達が有効な場合にユーザー トレースが同じアクティビティに表示されることが保証されます。 ただし、ServiceModel トレースは保証の対象ではありません。 ServiceModel トレースは、ユーザー コード アクティビティが設定されたのと同じスレッドでこれらのトレースの処理が実行される場合にのみ、ユーザー コード アクティビティで発生します。
一般に、ServiceModel トレースは次の場所で確認できます。
ServiceModel トレースが無効になっている場合、出力されたすべてのトレースがユーザー アクティビティに表示されます。 サーバーとクライアントの両方で伝達が有効になっている場合、これらのトレースは同じアクティビティになります。
ServiceModel トレースが有効になっていて、ActivityTracing が無効になっている場合、両方の側で伝達が有効になっている場合、ユーザー トレースは同じアクティビティに表示されます。 ServiceModel トレースは、アクティビティが最初に設定されているユーザー コード処理と同じスレッドで発生しない限り、既定の 0000 アクティビティに表示されます。
ServiceModel トレースと ActivityTracing の両方が有効になっている場合、ユーザートレースはユーザー定義アクティビティに表示され、ServiceModel トレースは ServiceModel 定義アクティビティに表示されます。 伝達は ServiceModel レベルで行われます。