4

2 つの WCF サービスを呼び出す WPF クライアントがあります。

1 つのサービスはクエリ専用で、もう 1 つのサービスはコマンド用です ( CQS パターン)。

コマンド サービスを呼び出すにはどうすればよいですか?

コマンド サービスのすべての操作は、値を返してはならないため、「一方向」でなければならないことをどこかで読みました。何か問題が発生した場合、操作はクライアントに「FaultException」をスローする必要があります。

しかし、コマンドがすべて一方向の場合、クライアントで何をすればよいでしょうか?

WPF クライアントに「AddProduct」ウィンドウがあり、情報を入力して「保存」を押したとします。

サービスで「AddProduct(Product)」を呼び出すようになりましたが、次のようになります。

  1. ウィンドウを閉じる必要がありますか?
  2. FaultException がないかどうかを確認するために 10 秒間待機する必要がありますか?
  3. 操作は「一方向」であってはなりませんか? もしそうなら - コマンドサービスのすべての操作は、「成功」または「失敗」を伴う何らかのタイプの一般的な「結果」オブジェクトを返す必要がありますか?
  4. セクション 3 が「はい」の場合 - 別のスレッドでサービスを呼び出し、サービスから応答が返るまでウィンドウのすべてのコントロールを「無効」にする必要がありますか?

ありがとう。

4

2 に答える 2

1

Resultオプション 3 が最適だと思いますが、クライアントにエラーを伝えるためにジェネリック オブジェクトは必要ないでしょう。ご存知かもしれませんが、SOAP メッセージでは例外がシリアル化されないため、クライアント側で通常の .NET 例外を受け取ることはありません。一方、FaultExceptionクライアントでキャッチすることにより、SOAP フォールトを利用することもできます。したがって、クライアントで例外がキャッチされなかった場合、すべてがうまくいきました。

フォルトの例外と、それらを有効に使用する方法の詳細については、次を参照してください。

契約およびサービスにおける障害の特定と処理

于 2012-05-12T18:41:43.493 に答える
1

On-Way を使用しても問題ないと思いますが、一方向通話の特性に注意する必要があります。サービスの例外を気にして処理できる場合は、#4が適切なオプションです。

一方向メッセージ - クライアントが呼び出しを発行すると、WCF は要求メッセージを生成しますが、相関メッセージがクライアントに返されることはありません。サービス側でスローされた例外は、クライアントには届きません。

あなたが持つべきことの1つは、サービス側の信頼性です。これにより、リクエストがサービスに配信されたことを保証できます.

トランスポート セッション (基本または wsHttp バインディング) がない場合、一方向操作の呼び出し中に例外が発生した場合、クライアントは影響を受けず、同じプロキシ インスタンスで呼び出しを送信し続けることができます。

トランスポート セッションが存在する場合、サービス側の例外によってチャネルが失敗するため、クライアントはプロキシを再利用してさらに呼び出しを送信できません。これにより、サーバー側で何か問題が発生したかどうかを検出するオプションが提供されます (ただし、何が問題であったかはわかりません)。ただし、サービスが FaultContracts を使用している場合でも、クライアントが何か問題が発生したことに気付いていない状況に陥る可能性があります。

サービスがサービス側の障害コントラクトにリストされている例外をスローした場合、これは通信チャネルに障害を発生させないため、一方向コントラクトを使用するクライアントは通信障害を検出できません。

于 2012-05-12T20:21:15.263 に答える