4

WCFサービスがあり、VS2010の「サービス参照の追加」を使用してクライアントを作成しています。

問題は、「非同期操作の生成」オプションがオフになっているにもかかわらず、サービスが非同期で呼び出されていることです。ここに画像の説明を入力してください

では、どうすればサービスを同期的に呼び出すことができますか?この動作は(クライアントまたはサーバーで)どこで定義されていますか?私はWCFに少し慣れていません。親切に啓発してください。

クライアントはコンソールアプリケーションです。

「非同期操作の生成」のチェックを外しています。それでも、プロキシには、メソッドが非同期的に呼び出されることを示す次の行が含まれています。理由はわかりません:)

 [System.ServiceModel.OperationContractAttribute(IsOneWay=true, Action="urn:COBService")]
    [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
    [System.ServiceModel.ServiceKnownTypeAttribute(typeof(MemberType))]
    void ABC(TestProject.ServiceReference1.ProcessCOBRecord request);

    [System.ServiceModel.OperationContractAttribute(IsOneWay=true, AsyncPattern=true, Action="urn:COBService")]
    System.IAsyncResult BeginABC(TestProject.ServiceReference1.ProcessCOBRecord request, System.**AsyncCallback** callback, object asyncState);

    void EndABC(System.IAsyncResult result);
4

3 に答える 3

3

アップデート

WCFサービス構成がこの非同期動作、具体的にはOperationContract属性のIsOneWayプロパティを引き起こしていたことが判明しました。これは技術的には非同期ではありませんが、「通常は非同期呼び出しのように見えます」


特別なことをする必要はありません。クライアントプロキシで通常のメソッドを呼び出すだけです。これが同期メソッドです。したがって、DoSomethingという名前のWCFメソッドがある場合は、次のように呼び出すだけです。

var client = new MyService.MyServiceClient();
client.DoSomething();

非同期メソッドであるclient.DoSomethingAsyncです。

この違いは、WCFサービスが応答するのを待っている間にアプリケーションがスレッドをブロックするかどうかに関係なく、クライアントの動作に関連しています。

于 2012-06-14T04:22:36.073 に答える
1

サービス参照の追加が完了したら、公開されているサービス操作ごとに同期メソッドを取得する必要があります。

同期メソッドは、サービス操作と同じ名前が付けられGetCustomersます。一方、非同期メソッドは2つの方法で生成されます:GetCustomersAsyncBeginGetCustomers/ EndGetCustomers

顧客を同期的に獲得したい場合は、を呼び出す必要がありますGetCustomers。その場合、GetCustomersはサービス操作が完了するまでブロックし、その後コードは次の行に移動します。

于 2012-06-14T04:24:12.610 に答える
1

非同期操作の生成オプションがオフの場合、サービスは同期的に呼び出されます

MSDNから

非同期操作の生成
WCF サービス メソッドを同期 (既定) で呼び出すか、非同期で呼び出すかを決定します。

于 2012-06-14T04:24:51.517 に答える