0

顧客のすべてのマシンで実行される WCF のアプリケーションがあります。しかし、ネット上のサーバーのように機能するのは 1 つだけです。

このモデルでは、WCF の「クライアント」が呼び出されるたびに、WCF の「サーバー」を呼び出して応答を取得します。

だから、私は私のインターフェイスにこの設定を持っています:

[WebInvoke(BodyStyle = WebMessageBodyStyle.WrappedRequest)]
[OperationContract]
MyObjectReturn CheckUpdate(string foo1, string foo2, string foo3);

私のコードでは、これは:

MyObjectReturn myObjReturn = new MyObjectReturn();
if (this.Master)
{
   myObjReturn.Code = 15000;
   myObjReturn.Message = "New Update found";
   return myObjReturn;
}
else
{
   var myTask = Task<MyObjectReturn >.Factory.StartNew(() =>
   {
      ServerContractClient server = new ServerContractClient(master.Url);
      return server.CheckUpdate(foo1, foo2, foo3);
   } 
   return myTask.Result;
} 

WCF の「クライアント」が「サーバー」を呼び出すと、常に null が返されます。「Task . Factory.StartNew」を使用しないと、Bad Request エラーが発生します

ヒントはありますか?

4

2 に答える 2

4

まず、「サーバー」と「クライアント」が優先される命名法です。

第二に、Servy には、データをすぐに戻したい場合、スレッドを開始しても意味がないという点があります。そうは言っても、スレッドは楽しいです!スレッドを立てたくないのは誰ですか? 適切に行うには、アプリケーションを少し修正する必要がありますが、現時点では、少なくとも WCF メソッドを非同期に設計する必要があり、呼び出しを行うクライアントはそれが非同期であることを認識している必要があります。それ以外の場合、経験したように、結果は null です。最良の出発点はここです。

于 2013-08-07T14:22:33.710 に答える
1

お恥ずかしい話ですが、問題は私が思っていたものではありませんでした。ブラウザー経由で WCF サーバーを呼び出すと、戻り値が null ではないことに気付きました。その時、私のバインディングが本当の問題であることに気づきました。次の 2 つのエラーがあることに気付きました。

1) 私のバインディングはコードで作成されます。インターフェースで説明したように、WebMessageBodyStyle を WrappedRequest として宣言しました。しかし、Binding Client を作成するときは、Wrapped を使用していました。

2) ServiceBehavior と DataContract の名前空間が異なっていたため、WCF で混乱が生じていました。

このリンクは、この最後の点を明確にするのに役立ちました:

別の WCF Web サービスへの WCF Web サービス呼び出しがデータを返さない

とにかく、この問題について非常に貴重なヒントをくれた皆さんに感謝します。

于 2013-08-08T13:07:12.950 に答える