2011-07-15 5 views
0

カスタムUserNamePasswordValidatorを持つWCFサーバーがあります。クライアント側ではWSDualHttpBindingを使用してWCFクライアントでFaultExceptionをキャッチできません

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!"); 
     } 
    } 
} 

、私はFaultExceptionがスローされていることを私は見ることができ、サーバのデバッガでは、

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

プロキシに追加間違った資格情報を使用して関数を呼び出します。しかし、クライアントはこの例外を受け取ることはありません。 クライアント側のTimeoutExceptionになります。

正しい資格情報を使用すると、サーバ側の機能が呼び出され、erveryが正常に動作するので、wcfが正しく動作しています。

しかし、FaultExceptionがクライアントにスローされ、クライアント側で資格情報が間違っていることを認識することができますか?

更新:WSHttpBindingを使用すると、MessageSecurityExceptionをキャッチできます。しかし、WSDualHttpBindingとデュアルチャネルを使用している場合、タイムアウトに陥っています。

答えて

0

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

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

+0

UserNamePasswordValidatorから継承し、Validate(string userName、string password)をオーバーライドする必要があるため、クライアントに値を返す方法はありません。このメソッドには(void)戻り値はありません。 http://msdn.microsoft.com/de-de/library/system.identitymodel.selectors.usernamepasswordvalidator.aspx#Y1026 – christian

+0

この場合、サービス内の例外をキャッチし、そこから値を返します。 –

+0

しかし、どこでそれを捕まえるべきですか?オブジェクトCustomUserNameValidatorが作成時にServiceHostに追加されます。 validateメソッドはwcfフレームワークによって呼び出されるので、検証とやりとりする方法はわかりません。 – christian

関連する問題