我目前正在开发一个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处理程序永远不会到达。
根据本网站上的类似问题,我已经尝试过以下方法:
BEGIN UPDATE 2
我真正希望实现的目标之一是:
到达GetAccountInfoCompleted(...)并能够通过GetAccountInfoCompletedEventArgs.Error属性或
能够通过try / catch子句
END UPDATE 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/