WCF RESTサービスのバックエンドになっているレガシーコードがたくさんあります。以前は通常のWCFサービスバックエンドでした。どのメソッドでも例外を捕捉して分析する仕組みを実装したいと思います。それが既知のエラーであることが判明した場合、処理され、フレンドリーな欠陥に変わります。WCF RESTサービス - 一般的な例外処理
「通常の」例外の代わりにFaultException
またはWebProtocolException
をスローすることができますが、例外がコード全体にスローされる場所がたくさんあり、それらのすべてを探すのはかなり苦しい選択です。
標準のWebHttpBehavior.AddServerErrorHandlers
メソッドをオーバーライドし、エラーハンドラ(IErrorHandler
実装)をエンドポイントディスパッチャエラーハンドラコレクションに追加する新しい動作を作成するエンドポイント動作拡張を追加しようとしました。エラーハンドラの中で私は例外を分析し、この例外に基づいて所望の障害を作成する(または作成しない)。
私は、このメカニズムが既知の例外のカスタムデータを返すと期待していましたが、間違っていました。良い古いMicrosoftは、不可避的に内部Microsoft.ServiceModel.Web.WebErrorHandler
をエンドポイントディスパッチャーエラーハンドラーコレクションの最後に追加する素晴らしい不可避のWebHttpBehavior2
を実装しました。このハンドラは、以前に実行されたすべてのハンドラを無視し、少数の例外セットのみを認識しますが、大半は「内部サーバエラー」などと解釈されます。
質問は、私が正しいパスにいるかどうか、WCF RESTメカニズムでこのハンドラを無効にする方法、または新しい例外を導入する方法があります(例外が検出された場合などは、 FaultExceptionなどのスロー/リターンの場合、この新しい例外は元のものではなくMicrosoft.ServiceModel.Web.WebErrorHandler
に提供されます)。 IErrorHandler
と動作拡張を使った私のすべての実験が役に立たない場合、代わりは何ですか?ここでも、私は実際に例外を投げるロジックを変更したくないので、例外をキャッチして処理する必要があります。
ありがとうございます!
このようなキャッチは、すべてのサービスメソッドに追加する必要があります。あるいは、すべての例外を処理するために一度だけどこかに書き込む方法はありますか?私はすべての例外に対して共通のハンドラを定義したので、ビヘイビアベースのアプローチが好きでした。それぞれのメソッドごとに例外を処理したり処理したりすることを心配する必要はありませんでした。最も良いことは、エンドポイント内のすべてのサービスに対して1つのプロセッサーを定義したことです。あなたのアプローチを使ってこれを達成することはできません。 –
'StatusDescription'を設定しても効果はありません!レスポンスには常に一般的なステータスの説明があります。とにかくそれを修正するには? – Hemant
です。あなたはfiddlerを使用してサーバーからの送信メッセージでそれを確認できます....しかし、あなたが見つけやすい傾向があるのは、さまざまなブラウザや異なる実装が説明を無視し、コードを使用して事前定義されたメッセージにマッピングすることです。私が作っていたAndroidアプリでこの問題を抱えていたので、説明を設定するだけでなく、メソッドシグネチャを変更して文字列を返すことができました。 Yikes! **それではWCF RESTをこれ以上使用することはありません。** – Aliostad