WP7:无法在对WCF服务的异步调用中捕获FaultException

时间:2012-03-19 10:07:50

标签: wcf windows-phone-7 asynchronous faultexception

我目前正在开发一个Windows Phone 7应用程序,它调用我也控制的WCF Web服务。该服务提供的操作在给定用户的登录名和密码时返回当前用户的帐户信息:

[ServiceContract]
public interface IWindowsPhoneService
{
    [OperationContract]
    [FaultContract(typeof(AuthenticationFault))]
    WsAccountInfo GetAccountInfo(string iamLogin, string password);
}

当然,总是存在身份验证失败的可能性,我想将这些信息传达给WP7应用程序。在这种情况下我可以简单地返回null,但我想传达身份验证失败的原因(即登录未知,密码错误,帐户被阻止......)。

这是我对上述操作的实现(出于测试目的,它所做的就是抛出异常):

public WsAccountInfo GetAccountInfo(string iamLogin, string password)
{
    AuthenticationFault fault = new AuthenticationFault();
    throw new FaultException<AuthenticationFault>(fault);
}

现在,如果我在WP7应用程序中调用此操作,请执行以下操作:

Global.Proxy.GetAccountInfoCompleted += new EventHandler<RemoteService.GetAccountInfoCompletedEventArgs>(Proxy_GetAccountInfoCompleted);
Global.Proxy.GetAccountInfoAsync(txbLogin.Text, txbPassword.Password);

void Proxy_GetAccountInfoCompleted(object sender, RemoteService.GetAccountInfoCompletedEventArgs e)
{
    if (e.Error != null)
    {
        MessageBox.Show(e.Error.Message);
        return;
    }
}

调试器在Reference.cs中断,说FaultException'1未处理,在这里:

public PhoneApp.RemoteService.WsAccountInfo EndGetAccountInfo(System.IAsyncResult result) {
      object[] _args = new object[0];
      PhoneApp.RemoteService.WsAccountInfo _result = ((PhoneApp.RemoteService.WsAccountInfo)(base.EndInvoke("GetAccountInfo", _args, result)));
      return _result;
}

BEGIN UPDATE 1

按F5时,异常会起泡到:

public PhoneApp.RemoteService.WsAccountInfo Result {
  get {
    base.RaiseExceptionIfNecessary();   // <-- here
    return ((PhoneApp.RemoteService.WsAccountInfo)(this.results[0]));
  }
}

然后到:

private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)
{
    if (System.Diagnostics.Debugger.IsAttached)
    {
        // An unhandled exception has occurred; break into the debugger
        System.Diagnostics.Debugger.Break();
    }
}

之后,应用终止(使用或不使用调试器)。

END UPDATE 1

现在,我想在我的代码中捕获异常,但我从未有机会,因为我的Completed处理程序永远不会到达。

根据本网站上的类似问题,我已经尝试过以下方法:

  • 重新添加服务参考 - &gt;没有变化
  • 从头开始重新创建一个非常简单的WCF服务 - &gt;同样的问题
  • 启动应用程序而不使用调试程序,以防止应用程序进入调试程序 - &gt;好吧,它没有破坏,但也没有抓住异常,应用程序只是退出
  • 告诉VS 2010不要破坏FaultExceptions(Debug&gt; Options) - &gt;没有任何影响
  • 在try {...} catch(FaultException){}中包裹我的应用程序中的每一行,甚至是catch(Exception) - &gt;从未打电话。

BEGIN UPDATE 2

我真正希望实现的目标之一是:

    理想情况下,
  • 到达GetAccountInfoCompleted(...)并能够通过GetAccountInfoCompletedEventArgs.Error属性或

  • 检索异常
  • 能够通过try / catch子句

  • 捕获异常

END UPDATE 2

如果有任何建议可以帮我解决这个问题,我将不胜感激。

2 个答案:

答案 0 :(得分:0)

框架似乎读取了您的WsAccountInfo.Result属性。 这会在客户端重新抛出异常。 但你应该是第一个读这个属性的人。

我不知道您的AuthenticationFault类,它是否具有DataContractAttribute并且它是一个已知类型,如示例中的 http://msdn.microsoft.com/en-us/library/system.servicemodel.faultcontractattribute.aspx

答案 1 :(得分:0)

我相信我遇到了同样的问题。我通过扩展代理类并在Client对象中调用私有的Begin ... / End ...方法而不是在Client对象上使用公共自动生成的方法来解决它。

有关详细信息,请参阅: http://cbailiss.wordpress.com/2014/02/09/wcf-on-windows-phone-unable-to-catch-faultexception/