1

WCF アプリケーションでグローバル エラー処理を提供したいと考えており、IErrorHandler を実装できることがわかっています。次に例を示します。

http://www.remondo.net/wcf-global-exception-handling-attribute-and-ierrorhandler/
http://www.codeproject.com/Articles/26320/WCF-Error-Handling-and-Fault-Conversion
http://www.haveyougotwoods.ca/2009/06/24/creating-a-global-error-handler-in-wcf

ただし、私が本当にやりたいことは、Fault 例外をログに記録したりスローしたりするだけでなく、呼び出し元にカスタム メッセージを返すことによって、例外を "処理" することです。ビジネス関連のメッセージ (検証エラーや警告など) を返すために、既にカスタム メッセージを使用しています。

非常に大まかな擬似コードでは、このような try-catch ブロックでこれを行います

public MyResponseDto CallMyService(MyRequestDto request)
{
        ... 
        try
            responseDto = blah blah blah
        catch (Exception ex)
            responseDto.ClientMessage.Description = ex.Messaeg
        finally    
           return responseDto;
}

私の質問は - グローバルハンドラーでこれを行うにはどうすればよいですか? 「ClientMessage」へのアクセスはどのように取得しますか?

私の直感は、サービスの内部メンバーにアクセスするには、属性を使用してからリフレクションを使用する必要があるということです??? しかし、それを応答メッセージ オブジェクトに戻すにはどうすればよいでしょうか?

ありがとう!

4

1 に答える 1

0

ちょうど 1 年ほど遅れていますが、あなたの質問を見つけてくれる人のために...

IErrorHandler インターフェイスの ProvideFault メソッドのシグネチャは次のようになります。

public void ProvideFault(Exception error, MessageVersion version, ref Message fault)

最後のパラメーターは、探しているものです。Message クラスには、多くのオーバーロードを持つ静的メソッド CreateMessage() があります。このように使用しています:

fault = Message.CreateMessage(version, "", new CustomErrorMessageDto("some error message"), new DataContractJsonSerializer(typeof(CustomErrorMessageDto)));

これにより、Json にシリアル化されたカスタム DTO をクライアントに提供できます。(Json のようなカスタム形式を返すことができるようにするために、サービスから Stream オブジェクトを返すことに注意してください。)

于 2013-06-24T08:37:30.180 に答える