HTTP、TCP、または名前付きパイプを使用した非同期シナリオ

ここでは、マルチスレッド要求で HTTP、TCP、または名前付きパイプを使用したときの、さまざまな非同期要求/応答シナリオでのアクティビティおよび転送について説明します。

エラーを伴わない非同期要求/応答

ここでは、マルチスレッド クライアントを使用したときの、非同期要求/応答シナリオでのアクティビティおよび転送について説明します。

呼び出し元アクティビティは、beginCall が返され、endCall が返されると終了します。 コールバックが呼び出されたときは、そのコールバックが返されます。

呼び出されたアクティビティは、beginCall が返され、endCall が返されると終了します。または、そのアクティビティからコールバックが呼び出された場合は、コールバックが返されると終了します。

コールバックを伴わない非同期クライアント

HTTP を使用して、両方の側で伝達が有効になっている場合

Asynchronous client with no callback where propagateActivity is set to true on both sides.

propagateActivity=true の場合、"メッセージを処理" は転送先の "アクションを処理" アクティビティを示します。

HTTP ベースのシナリオでは、最初に送信するメッセージで "バイトを受信" が呼び出され、要求の有効期間だけ存在します。

HTTP を使用して、両方の側で伝達が無効になっている場合

どちらかの側で propagateActivity=false の場合、"メッセージを処理" は転送先の "アクションを処理" アクティビティを示しません。 したがって、新しい ID を使用して、新しい一時的な "アクションを処理" アクティビティが呼び出されます。 非同期応答と ServiceModel コード内の要求が一致する場合は、アクティビティ ID をローカル コンテキストから取得できます。 その ID を使用して、実際の "アクションを処理" アクティビティに転送できます。

Asynchronous client with no callback where propagateActivity is set to false on either side.

HTTP ベースのシナリオでは、最初に送信するメッセージで "バイトを受信" が呼び出され、要求の有効期間だけ存在します。

"アクションを処理" アクティビティは、呼び出し元または呼び出し先で propagateActivity=false の場合、および応答メッセージに Action ヘッダーが含まれない場合に、非同期クライアントで作成されます。

TCP または名前付きパイプを使用して、両方の側で伝達が有効になっている場合

Asynchronous client with no callback where propagateActivity is set to true on both sides and named pipe/TCP.

名前付きパイプまたは TCP ベースのシナリオでは、クライアントが開かれるときに "バイトを受信" が呼び出され、接続の有効期間だけ存在します。

最初の画像と同様、propagateActivity=true の場合、"メッセージを処理" は転送先の "アクションを処理" アクティビティを示します。

TCP または名前付きパイプを使用して、両方の側で伝達が無効になっている場合

名前付きパイプまたは TCP ベースのシナリオでは、クライアントが開かれるときに "バイトを受信" が呼び出され、接続の有効期間だけ存在します。

2 つ目の画像と同様、どちらかの側で propagateActivity=false の場合、"メッセージを処理" は転送先の "アクションを処理" アクティビティを示しません。 したがって、新しい ID を使用して、新しい一時的な "アクションを処理" アクティビティが呼び出されます。 非同期応答と ServiceModel コード内の要求が一致する場合は、アクティビティ ID をローカル コンテキストから取得できます。 その ID を使用して、実際の "アクションを処理" アクティビティに転送できます。

Asynchronous client with no callback where propagateActivity is set to false on either side and named pipe/TCP.

コールバックを伴う非同期クライアント

このシナリオでは、コールバックと endCall に対するアクティビティ G と A’、およびその転送 (送受信) が追加されています。

ここでは、propagateActivity=true で HTTP を使用する例だけを示します。 ただし、追加のアクティビティや転送は、その他の場合 (つまり、propagateActivity=false で TCP または名前付きパイプを使用) にも適用されます。

クライアントがユーザー コードを呼び出して結果の準備が完了したことを通知すると、コールバックは新しいアクティビティ (G) を作成します。 ユーザー コードは、次に、コールバック内 (図 5 を参照) またはコールバック外 (図 6 を参照) で endCall を呼び出します。 endCall がどのユーザー アクティビティから呼び出されているかわからないため、このアクティビティには A’ というラベルが付けられています。 A’ と A が同じである場合もありますし、異なる場合もあります。

Shows an asynchronous client with callback, endcall in callback.

Shows an asynchronous client with callback, endcall outside callback.

コールバックを伴う非同期サーバー

Shows an asynchronous server with callback.

チャネル スタックは、"メッセージを受信" でクライアントをコールバックします。この処理のトレースは、"要求を処理" アクティビティ自体で出力されます。

エラーを伴う非同期要求/応答

エラー メッセージは、endCall 中に受信されます。 この点を除き、アクティビティおよび転送は前のシナリオと同様です。

エラーを伴う/伴わない非同期一方向要求/応答

クライアントに返される応答やエラーはありません。