无法在try catch块中捕获Webservice调用方法

时间:2014-04-01 13:10:59

标签: c# web-services windows-phone-8 async-await

我正在开发一个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中提到的内容,但我仍然得到了相同的异常

2 个答案:

答案 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);
}