4

非同期呼び出しをサポートするWCFサービスを作成しようとしています。私は見つけたすべてのサンプルとチュートリアルに従いました、そしてそれらのすべては1つの同期メソッドの通常のパターンを持っています、そして非同期のBeginとEndは次のようになります:

[OperationContract(AsyncPattern = false)]
string GetData(int value);

[OperationContract(AsyncPattern = true)]
IAsyncResult BeginGetData(int value, AsyncCallback callback, object asyncState);

string EndGetData(IAsyncResult result);

ただし、クライアント側で何をしても、同期GetDataのみが呼び出されます。Fiddlerは、メッセージは常に同じであると言っています。

 <s:Envelope
 xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><GetData
 xmlns="http://tempuri.org/"><value>0</value></GetData></s:Body></s:Envelope>

同期GetDataインターフェースを削除すると、asyncメソッドが正しく呼び出されるようになりました。

これは正常な動作ですか?メソッドの同期バージョンと非同期バージョンをサポートするために他にすべきことはありますか?

4

1 に答える 1

6

これはよくある誤解です。クライアントが非同期呼び出しを行えるようにするには、サーバーを非同期にする必要があると想定しています。本当じゃない。サーバーとクライアントは100%独立しています。それらはバイナリワイヤプロトコルによって分離されています。

SOAPは同期または非同期について何も知らないため、Fiddlerに表示されるメッセージは常に同じです。SOAPレベルでは、決定は明らかになりません。そのため、クライアントはサーバー側の決定も監視できません。

これは、サーバーを同期化するだけで、真に非同期のクライアントを使用できることを意味します。またはその逆も可能です。

いずれの場合も、サーバーには同期または非同期の1つのパターンのみを実装する必要があります。決して両方ではありません。実装の1つを取り除きます。機能的な観点からは、どちらにとどまるかは問題ではありません。

私はここのコメントから重要な情報を引き出しています:

サーバー側の非同期をいつ使用するかについての説明をこのコメントボックスに収めるのは困難です。つまり、デフォルトではサーバー上で使用しないでください。特別な事情により魅力的または必要な場合に使用してください。

メタレベルでは、非同期IOが流行になっていることを指摘しておきます。コミュニティは現在、これについて非常に不幸な誤った情報の状態にあります。

于 2012-10-28T12:51:38.323 に答える