WP7: не удается перехватить FaultException при асинхронных вызовах службы WCF - PullRequest
5 голосов
/ 19 марта 2012

В настоящее время я разрабатываю приложение для 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

Буду признателен за любой совет, который поможет мне решить эту проблему.

Ответы [ 2 ]

0 голосов
/ 09 февраля 2014

Мне кажется, у меня была такая же проблема.Я решил это, расширив прокси-класс и вызвав закрытые методы Begin ... / End ... внутри объекта Client, а не используя открытые автоматически сгенерированные методы объекта Client.

Для получения дополнительной информации,пожалуйста см .: http://cbailiss.wordpress.com/2014/02/09/wcf-on-windows-phone-unable-to-catch-faultexception/

0 голосов
/ 30 апреля 2012

Кажется, что фреймворк читает ваше свойство WsAccountInfo.Result. Это отбрасывает исключение на стороне клиента. Но вы должны первым прочитать это свойство.

Я не знаю ваш класс AuthenticationFault, имеет ли он DataContractAttribute и является ли он известным типом, как в примере в http://msdn.microsoft.com/en-us/library/system.servicemodel.faultcontractattribute.aspx?

...