1

私は、WCFを使用してサーバーとクライアント間の真の非同期通信を実装するための代替案を研究しています。もちろん、私はにぶつかりましたAsyncPattern = true

少し騒ぎ立てた後、インターフェイスではなくAsyncPatternサービスの実装を非同期にするために使用されていることを発見しました。つまり、クライアントに公開されているサービスはまだ同期しています。たとえば、次のように、 andという非同期ペアを想定します。BeginMethodEndMethod

[ServiceContract]
interface IMyService
{
    [OperationContract(AsyncPattern = true)]
    IAsyncResult BeginMyMethod(...);

    MyComplexResult EndMyMethod(...);
}

現在、そこから生成されたWSDLは、MyMethodと呼ばれる単一のメソッドのみを公開します。

<wsdl:portType name="IMyService">
    <wsdl:operation name="MyMethod">
         <wsdl:input wsaw:Action="http://tempuri.org/IMyService/MyMethod" message="tns:IMyService_MyMethod_InputMessage"/>
         <wsdl:output wsaw:Action="http://tempuri.org/IMyService/MyMethodResponse" message="tns:IMyService_MyMethod_OutputMessage"/>
    </wsdl:operation>
</wsdl:portType>

問題は、WCFがAPMの2つのメソッドを実際にクライアントに公開するように強制する構成はありますか?

4

1 に答える 1

2

あなたが達成しようとしているのは、この設定の目的ではありません。WSDL を作り直すこともできますが、これは良い方法ではありません。

クライアントからの非同期呼び出しパターンを実現するために、OneWay や Duplex などの他のメッセージング オプションを試すことができます。MSDN: 一方向通話、コールバック、およびイベントについて知っておくべきこと ( Juval Lowy 著) を参照してください。

OperationContractAttribute.AsyncPattern プロパティの詳細:

「サーバー上の非同期メソッド ペアは、基になる Web サービス記述言語 (WSDL) の操作の記述に影響を与えない実装の詳細であるため、クライアントは影響を受けません。このようなメソッドは、メッセージを関連付けられた単一の操作としてクライアントに表示されます。WCF は自動的に受信メッセージを Begin メソッドにルーティングし、 End 呼び出しの結果を送信メッセージにルーティングします.したがって、クライアント チャネルは、メソッドのペアを単一の同期操作または非同期操作のペアとして表すことができます. クライアントの表現はどのような場合でもありません.サーバー上の非同期実装に何らかの影響を与えます。」

「クライアント コントラクトは、AsyncPattern プロパティを使用して、クライアントが非同期的に操作を呼び出すために使用できる非同期メソッド ペアを示すことができます。通常、クライアント アプリケーションは、ServiceModel メタデータ ユーティリティ ツール (Svcutil.exe) ツールと /async オプションを使用して、Begin を生成します。クライアントが操作を非同期的に呼び出すために使用できる End メソッドのペア". [このメソッド ペア BeginXXXX/EndXXXX はクライアントで生成されます]

于 2013-01-31T23:34:48.337 に答える