В настоящее время я разрабатываю приложение для Windows Phone 7, которое вызывает веб-службу WCF, которой я также управляю. Сервис предлагает операцию, которая возвращает информацию об учетной записи текущего пользователя, когда ему присвоено имя пользователя и пароль:
[ServiceContract]
public interface IWindowsPhoneService
{
[OperationContract]
[FaultContract(typeof(AuthenticationFault))]
WsAccountInfo GetAccountInfo(string iamLogin, string password);
}
Конечно, всегда есть вероятность сбоя аутентификации, и я хочу передать эту информацию в приложение WP7. В этом случае я мог бы просто возвратить ноль, но я хотел бы сообщить причину, по которой аутентификация не удалась (то есть логин неизвестен, неправильный пароль, аккаунт заблокирован, ...).
Это моя реализация вышеуказанной операции (для целей тестирования все, что она выдает, - это исключение):
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;
}
НАЧАЛО ОБНОВЛЕНИЯ 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();
}
}
После этого приложение завершает работу (с отладчиком или без него).
КОНЕЦ ОБНОВЛЕНИЯ 1
Теперь я хотел бы поймать исключение в моем коде, но мне никогда не дают такой возможности, поскольку мой обработчик Completed никогда не достигается.
Исходя из похожих вопросов на этом сайте, я уже попробовал следующее:
- Повторно добавить сервисный номер -> без изменений
- Повторно создайте действительно простой сервис WCF с нуля -> та же проблема
- Запустите приложение без отладчика, чтобы приложение не врывалось в отладчик -> ну, оно не ломается, но исключение также не перехватывается, приложение просто выходит
- Скажите VS 2010, чтобы он не прерывался на FaultExceptions (Debug> Options) -> не имеет никакого эффекта
- переносить каждую строку в моем приложении в try {...} catch (FaultException) {} или даже catch (Exception) -> никогда не вызывается.
НАЧАТЬ ОБНОВЛЕНИЕ 2
То, чего я на самом деле хотел бы достичь, это одно из следующих действий:
в идеале, достигните GetAccountInfoCompleted (...) и сможете получить исключение через свойство GetAccountInfoCompletedEventArgs.Error или
быть в состоянии перехватить исключение с помощью предложения try / catch
END UPDATE 2
Буду признателен за любой совет, который поможет мне решить эту проблему.