1

私はWCFでフォールト例外を学習している最中で、少し問題があります。誰かが次のことを行うための適切な方法を提案できるかどうかを確認したいと思います。

私の例では、ログイン サービス メソッドがあるという状況です。無効なログイン試行が行われると、カスタム エラー例外がスローされます。メソッドには try catch もあり、その他の不明なエラーはすべてキャッチされ、カスタムの Unknown fault 例外としてクライアントに送信されます。

問題は、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
}

上記はクライアント側のエラー処理です

4

1 に答える 1

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));
}
于 2013-01-30T00:43:32.037 に答える