来自Silverlight的WCF呼叫挂起

时间:2009-12-13 00:31:13

标签: wcf silverlight

不确定我是否做错了...但我正在尝试实现可以​​从WCF调用的WCF服务。我在客户端上实现了异步模式,这就是调用的样子:

BasicHttpBinding basicHttpBinding = new BasicHttpBinding();
EndpointAddress endpointAddress = new EndpointAddress(AccountServiceURL);
var personService = new ChannelFactory<IAccountService>(basicHttpBinding, endpointAddress).CreateChannel();

var result = personService.BeginRegister(username, password, email, null, null);
personService.EndRegister(result); // <-- failing here

它挂在“EndRegister”电话上......它只是坐在那里什么都不做。并且firefox.exe变得没有响应。服务器似乎永远不会接收到调用,因为我在方法调用上有一个断点。也许有人可以看到我做错了什么?

合同在客户端看起来像这样:

[ServiceContract]
public interface IAccountService
{
    [OperationContract(AsyncPattern = true)]
    IAsyncResult BeginRegister(string username, string password, string email, AsyncCallback callback, Object state);

    void EndRegister(IAsyncResult result);
}

并在服务器上这样:

[ServiceContract]
public interface IAccountService
{
    [OperationContract]
    void Register(string username, string password, string email);
}

2 个答案:

答案 0 :(得分:2)

如果你在UI线程(你可能是)上调用它,那么它将使你的Silverlight运行时崩溃。最后一次电话......

personService.EndRegister(result); 

...将要阻止,根据我的经验,Silverlight运行时确实非常讨厌在这样的IO调用上阻止UI线程时。您应该响应事件或回调,然后在该事件或回调处理程序内进行EndRegister调用。

答案 1 :(得分:0)

我可以理解,因为Silverlight的WCF基础设施根本不使用ThreadPool。因此,对BeginXXX的调用并不是真正的异步调用...

我也偶然发现了非常奇怪的行为:

var ar = svc.BeginXxx(null, null);
var response = svc.EndXxx(ar);

和我们的app handgs。