Не удалось перехватить FaultException в клиенте WCF с помощью WSDualHttpBinding - PullRequest
0 голосов
/ 15 июля 2011

У меня есть WCF-сервер с пользовательским UserNamePasswordValidator.

public class CustomUserNameValidator : UserNamePasswordValidator
{
    private readonly string m_userName;
    private readonly string m_password;

    /// <summary>
    ///  CustomUserNameValidator
    /// </summary>
    /// <param name="userName"></param>
    /// <param name="password"></param>
    public CustomUserNameValidator(string userName, string password)
    {
        m_userName = userName;
        m_password = password;
    }

    /// <summary>
    /// Validate
    /// </summary>
    /// <param name="userName"></param>
    /// <param name="password"></param>
    public override void Validate(string userName, string password)
    {
        if (!(userName == m_userName && password == m_password))
        {
            throw new FaultException("Authentication failed!");
        }
    }
}

На стороне клиента я вызываю функцию с неверными учетными данными, добавленными в прокси

try
{
    return service.GetServiceDescription();
}
catch (FaultException)
{
}
catch (TimeoutException)
{
}

В отладчике сервера я вижу, что FaultException выбрасывается. Но клиент никогда не получит это исключение. Это закончится в TimeoutException на стороне клиента.

Если я использую правильные учетные данные, будет вызвана функция на стороне сервера, и все работает хорошо, поэтому wcf работает правильно.

Но что я должен сделать, чтобы исключение FaultException было передано клиенту, чтобы я мог понять, что учетные данные неверны на стороне клиента?

ОБНОВЛЕНИЕ: работает, когда я использую WSHttpBinding, я могу перехватить исключение MessageSecurityException. Но когда я использую WSDualHttpBinding и двухканальный канал, у меня заканчивается время ожидания.

1 Ответ

0 голосов
/ 15 июля 2011

Вы не должны (и, насколько я знаю, не) иметь исключения, переходящие от обслуживания к клиенту.Правильный способ обработки таких вещей - вернуть значение, указывающее, был ли пользователь действительным.Вы также можете включить некоторую информацию о причине недопустимости пользователя.

Еще одна вещь о вашем подходе.Использование исключений для работы с реальной бизнес-логикой (например, проверка пользователя) считается плохой практикой.

...