Не удается перехватить FaultException в клиенте WCF с помощью WSDualHttpBinding
У меня есть 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 ответ
Вы не должны (и, насколько я знаю, не могу) иметь исключения, переходящие от обслуживания к клиенту. Правильный способ обработки таких вещей - вернуть значение, указывающее, был ли пользователь действительным. Вы также можете включить некоторую информацию о причине недопустимости пользователя.
Еще одна вещь о вашем подходе. Использование исключений для работы с реальной бизнес-логикой (например, проверка пользователя) считается плохой практикой.