Исключение на стороне службы WCF, перехватывающее исключение FaultException

Я нахожусь в процессе изучения исключения сбоя с WCF, и у меня небольшая проблема. Я хотел бы узнать, может ли кто-нибудь предложить подходящий метод для выполнения следующих действий.

В моем примере ситуация такова, что у меня есть метод службы входа в систему. Когда делается недопустимая попытка входа в систему, я генерирую пользовательское исключение ошибки. У меня также есть попытка перехвата в методе, чтобы любая другая неизвестная ошибка перехватывалась и отправлялась клиенту как настраиваемое исключение неизвестной ошибки.

Проблема в том, что когда я выбрасываю исключение AuthenticationFault, общий перехват исключения также захватывает его и вместо этого принудительно отправляет UnknownFault.

Изучив код, я могу понять, почему это происходит. Итак, мне остается спросить сообщество, каким должен быть правильный способ справиться с этим?

Не следует ли мне использовать общий перехват исключения в службе и всегда позволять клиенту обрабатывать это? Я действительно не хотел использовать этот подход, потому что тогда как я буду обрабатывать другие возможные неизвестные исключения на сервере и, возможно, регистрировать их?

Возможно ли иметь состояние перехвата что-то вроде «перехвата любых исключений-исключений-сбоев»?

Спасибо, код ниже.

try
{
    Authenticator AuthTool = new Authenticator();
    if (AuthTool.Authenticate(credentials))
    {
        //--Successful login code
    }
    else
    {
        AuthenticationFault fault = new AuthenticationFault();
        fault.Message = "Invalid Login or Password";
        throw new FaultException<AuthenticationFault>(fault, new FaultReason(fault.Message));
    }
}
catch (Exception ex)
{
    UnknownFault fault = CommonUtil.CreateCommonFault(ex);
    throw new FaultException<UnknownFault>(fault, new FaultReason(fault.ErrorMessage));
}

Приведенный выше код "catch (Exception ex)" перехватывает исключение сбоя, сгенерированное ранее.

try
{
    //--proxy call to the service Login method
}
catch (FaultException<AuthenticationFault> af)
{
    //--Never gets here
}
catch (FaultException<UnknownFault> uf)
{
    //--This is what is handling although I threw the AuthenticationFault
}
catch (Exception ex)
{
    //--any other unknown error
}

Выше приведена обработка ошибок на стороне клиента.


person Esteban Martinez    schedule 29.01.2013    source источник


Ответы (1)


Вам нужно явно поймать и перебросить свой AuthenticationFault в первом блоке. Ваша основная проблема - преобразовать его в FaultException<UnknownFault>.

try
{
    Authenticator AuthTool = new Authenticator();
    if (AuthTool.Authenticate(credentials))
    {
        //--Successful login code
    }
    else
    {
        AuthenticationFault fault = new AuthenticationFault();
        fault.Message = "Invalid Login or Password";
        throw new FaultException<AuthenticationFault>(fault, new FaultReason(fault.Message));
    }
}
catch (FaultException<AuthenticationFault>
{
    throw;
}
catch (Exception ex)
{
    UnknownFault fault = CommonUtil.CreateCommonFault(ex);
    throw new FaultException<UnknownFault>(fault, new FaultReason(fault.ErrorMessage));
}
person Mike Parkhill    schedule 30.01.2013
comment
Спасибо, что сработало. Сначала, когда я читал ваше решение, я подумал, что второй улов поймает повторный бросок. Спасибо еще раз! - person Esteban Martinez; 30.01.2013