2

ASP.NETWebAPIを使用してHTTPAPIを作成しています。処理していない例外が発生した場合、その動作は、意図的にHttpResponseExceptionをスローした場合とは大きく異なることに気付きました。これにより、クライアントがエラーを確実に処理して「理由」メッセージを表示することが困難になります。

たとえば、次のコードを検討してください。

[HttpPost]
public void ThisWillThrowAnError()
{
    try
    {
        var i = 0;
        var b = 1 / i; // cause divide by zero exception for testing
    }
    catch (Exception ex)
    {
        HttpResponseMessage message = new HttpResponseMessage();
        message.ReasonPhrase = "Error: " + ex.Message;
        throw new HttpResponseException(message);
    }
}

これにより、HTTPヘッダーにエラーがあり、応答コードが500に設定されている応答が作成されます。 エラー:この要求は処理できませんでした。ゼロ除算を試みました。

実際の応答本文は空です。

ただし、try / catchブロックを削除した場合、またはHttpResponseExceptionを手動でスローしない例外が発生した場合は、まったく異なる動作が発生します。ステータスコードはまだ500ですが、ヘッダーメッセージには「内部サーバーエラー」と表示され、メッセージは次のようなJSON形式でエンコードされます。

{
  "Message": "An error has occurred.",
  "ExceptionMessage": "Attempted to divide by zero.",
  "ExceptionType": "System.DivideByZeroException",
  "StackTrace": " at ProjectName.Controllers (etc....)"
}

後者の方がデバッグのためのより多くの情報を提供するので私は後者を好むと思いますが、メッセージをカスタマイズしたり、問題に対してユーザーが読み取れるメッセージを提供したりする機能がなくなります。

WebAPIが例外の処理方法と矛盾するのはなぜですか?私はこの矛盾を引き起こすために自分で何かをしていますか?かなり面倒で操作が難しいように思われ、2つの異なるタイプのエラー応答を処理するように呼び出し元のアプリケーションをコーディングする必要があることを意味する場合があります:(

4

2 に答える 2

2

エラー応答を作成するときは、HttpRequestMessage.CreateErrorResponseを使用して、WebAPIが送信するものと一致するエラー応答を作成することを検討してください。

このブログ投稿が役立つことを願っています:http: //blogs.msdn.com/b/youssefm/archive/2012/06/28/error-handling-in-asp-net-webapi.aspx

于 2012-12-01T01:53:39.593 に答える
0

メッセージ ハンドラを使用します。メッセージ ハンドラーは、HTTP 要求を受け取り、HTTP 応答を返すクラスです。したがって、基本的に応答構造を 1 か所で変更し、成功と失敗、および Web API のすべての要求に対して同じ応答を得ることができます。私のブログ投稿でそれについて読むことができます: https://www.vladopandzic.com/asp-net-web-api/building-consistent-responses-asp-net-web-api/

于 2017-09-12T10:58:24.657 に答える