私は RESTful API を構築しており、消費者へのすべての可能な出力を制御したいと考えています。ExceptionFilterAttribute
コントローラーで発生したすべての例外をフィルター処理するために を実装しています。ただし、これでは、コントローラー コードに到達する前にアプリケーションで発生する可能性のあるエラー (ルーティング エラーなど) を制御することはできません。デフォルトの動作では、標準のシリアル化された HttpError が返され、コントローラーのクラス名など、好みに合わない内部情報が多すぎます。これは避けたいと思います。この動作を変更する最良の方法は何ですか?
2 に答える
これを行うためにを追加できますMessageHandler
。
MessageHandlers
パイプラインの最初と最後に実行されるため、生の受信リクエストと生の送信レスポンスを処理できます。
例えば:
public class ErrorHandler : DelegatingHandler
{
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
var response = await base.SendAsync(request, cancellationToken);
if (!response.IsSuccessStatusCode)
{
Debug.WriteLine("something happened! - " + response.ReasonPhrase);
}
return response;
}
}
そして、あなたのGlobalConfiguration
config.MessageHandlers.Add(new ErrorHandler());
これは基本的に発信応答を検査し、ステータス コードが 2xx であるかどうかを確認します。そうでない場合は、何かを行うことができます-ログに記録するか、おそらく応答の内容をリセットして、隠したいものを非表示にします。
実際、デフォルトでは、内部情報がリモートクライアントに漏洩しないように細心の注意を払っています。リクエストがデバッグ目的でローカルマシンから送信された場合、内部情報を提供しますが、リモートクライアントには送信しません。リモートクライアントの応答がどのようになるかを確認したい場合は、構成で次の設定を試してください。
config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Never;
WebAPIのエラー処理の詳細については、このブログ投稿も参照してください。
http://blogs.msdn.com/b/youssefm/archive/2012/06/28/error-handling-in-asp-net-webapi.aspx
それでもデフォルトが機能しない場合は、Filipの提案に従い、メッセージハンドラーで応答をインターセプトして、好きなものを送り返す必要があります。