0

カスタム UserNamePasswordValidator を備えた WCF サーバーがあります。

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 とデュアル チャネルを使用していると、タイムアウトが発生します。

4

1 に答える 1

0

サービスからクライアントにクロスオーバーする例外を持つべきではありません (そして、私が知る限り)。このようなことを処理する正しい方法は、ユーザーが有効かどうかを示す値を返すことです。また、ユーザーが無効になった原因に関する情報を含めることもできます。

あなたのアプローチについてのもう一つのこと。実際のビジネス ロジック (ユーザーの検証など) を処理するために例外を使用することは、悪い習慣と見なされます。

于 2011-07-15T11:30:26.190 に答える