我正在开发一个WP8应用程序。我在out-systems上创建了一个Web服务,然后我在我的应用程序中调用了这些Web服务方法:
ServiceReference1.WebServiceClient ws = new WebServiceClient();
try
{
ws.FetchInboxAsync(EmailId);
}
catch(Exception e)
{
MessageBox.Show(e.Message);
}
现在如果服务器关闭,我希望控件进入catch块,但它没有,我得到以下异常:
类型' System.ServiceModel.CommunicationException'的例外情况 发生在System.ServiceModel.ni.dll中但未在用户中处理 代码。
我确实意识到Web服务调用方法是异步的,因此它的异常不会在try catch中捕获。在论坛上,人们建议使用await关键字。但是当我写作
await ws.FetchInboxAsync(EmailId);
我收到错误:无法等待无效。
我尝试了答案here中提到的内容,但我仍然得到了相同的异常
答案 0 :(得分:3)
您可以订阅FetchInboxCompleted事件:
ServiceReference1.WebServiceClient ws = new WebServiceClient();
ws.FetchInboxCompleted += new EventHandler<ServiceReference1.FetchInboxCompletedEventArgs>(c_FetchInboxCompleted);
ws.FetchInboxAsync(EmailId);
在事件处理程序中,检查结果:
static void c_FetchInboxCompleted(object sender, serviceReference1.FetchInboxCompletedEventArgs e)
{
// check e.Error which contains the exception, if any
}
答案 1 :(得分:3)
如果自动生成的WCF客户端代理支持它,您应该能够等待以TaskAsync
结尾的方法:
await ws.FetchInboxTaskAsync(EmailId);
如果自动生成的WCF客户端代理没有定义此方法,那么您可以自己定义as described on MSDN:
public static Task FetchInboxTaskAsync(this ServiceReference1.WebServiceClient client, string emailId)
{
return Task.Factory.FromAsync(client.BeginFetchInbox, client.EndFetchInbox, emailId, null);
}