我在WCF中有一个应用程序,可以在我的客户的所有计算机上运行。但只有一个像网络中的服务器一样工作。
在此模型中,每次调用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”,我收到错误请求错误
任何提示?
答案 0 :(得分:4)
呃,首先,“服务器”和“客户端”是preferred nomenclatures。
其次,Servy有一个观点,即如果你想立即恢复数据,那么启动一个线程就没有意义了。那说,线程很有趣!谁不想线程?要正确地执行它,您必须稍微修改一下您的应用程序,但是现在您至少必须将WCF方法设计为异步,并且进行调用的客户端需要知道它是异步的;否则结果为null,正如您所经历的那样。最佳出发点是here。
答案 1 :(得分:1)
我很惭愧地说出来,但问题不在于我的想法。我注意到当我通过浏览器调用WCF服务器时,我的返回不是null。就在那时,我意识到我的Binding是真正的问题。我注意到有两个错误:
1)我的Bindding是通过代码创建的。如我的界面所述,我将WebMessageBodyStyle声明为WrappedRequest。但是在创建Binding Client时,我使用的是Wrapped;
2)我的ServiceBehavior和DataContract的命名空间不同,这也引起了WCF的混淆。
此链接帮助我澄清了最后一点:
WCF Web Service Call to Another WCF Web Service returns no data
无论如何,谢谢所有给我这个问题的非常有价值的提示。