web-dev-qa-db-ja.com

WCF例外処理戦略

カスタムクライアントアプリケーションを実行している一部のハンドヘルドの通信手段として機能するプロキシをWCFで開発しています。すべてのプロキシ呼び出しをtry/catchでラップしたくないので、人々がどのようなエラー処理戦略を使用するのか興味があります。

ASP .NETを開発するとき、例外の大部分をキャッチしません。グローバルasaxのApplication_Errorを利用して、例外をログに記録し、電子メールを送信して、ユーザーをカスタムエラーランディングページにリダイレクトします。 。私がWCFで探しているものはこれに似ていますが、中央の場所からクライアントに一般的な障害の理由を渡すことができる点が異なります。

基本的に、WCFアプリで例外処理を一元化する方法に興味があります。

ありがとう

24
xximjasonxx

IErrorHandler インターフェイスがここで役立つ場合があります。私たちはこれを使用して、あなたが言及していることのほとんどを実行しています-集中化された例外ロギングと、問題をローカルで処理するために多数の試行/キャッチをコードに散らかすことなく、一般化された障害理由を提供します。

22
lee-m

これが私がしたことです。アプリケーションには、BusinessRuleExceptionやProcessExceptionなどのカスタム例外がいくつかあります。WCFはFaultExceptionとFaultException<T>の両方をサポートしています。

一般的な慣例では、一般的なエラーや、何が起こったのかを正確に表示したくないエラーの場合は、常にクライアントにFaultExceptionをスローするようです。その他の場合は、FaultException<T>を渡すことができます。ここで、Tは、特定の例外に関する情報を持つクラスです。

私はアプリケーションでこの違反の概念を作成しました。これは基本的に、カスタム例外には対応する違反インスタンスを含むプロパティがあることを意味します。次に、このインスタンスはクライアントに渡され、クライアントは回復可能なエラーが発生したことを認識できるようになりました。

これで問題の一部は解決しましたが、ロギングを一元化できるようにするための一般的なキャッチが必要でした。これは、IErrorHandleインターフェイスを使用し、独自のカスタムエラーハンドラーをWCFに追加することで見つかりました。コードは次のとおりです。

public class ServiceHostGeneralErrorHandler : IErrorHandler
{
    public void ProvideFault(Exception ex, MessageVersion version, ref Message fault)
    {
        if (ex is FaultException)
            return;

        // a general message to the client
        var faultException = new FaultException("A General Error Occured");
        MessageFault messageFault = faultException.CreateMessageFault();
        fault = Message.CreateMessage(version, messageFault, null);
    }

    public bool HandleError(Exception ex)
    {
        // log the exception

        // mark as handled
        return true;
    }
}

この方法を使用すると、例外をそれが何であれ、クライアントに簡単に表示できるものに変換すると同時に、ITスタッフが確認できるように実際の例外をログに記録できます。これまでのところ、このアプローチは非常にうまく機能しており、アプリケーションの他のモジュールと同じ構造に従います。

15
xximjasonxx

例外処理アプリケーションブロックを使用し、機密情報の開示を回避するためにほとんどの障害をクライアントから保護します。この article は、次のように、適切な開始点になる可能性があります。 「ベストプラクティス」-ドメインに適したものを使用する必要があります。

2
Ta01