web-dev-qa-db-ja.com

asp.net Web APIでjsonエラーメッセージを返す方法は?

私はjsonエラーメッセージを返したいのですが、現時点ではフィドラーではjsonパネルでこれを見ることができません:

string error = "An error just happened";
JsonResult jsonResult = new JsonResult
{
     Data = error,
     JsonRequestBehavior = JsonRequestBehavior.AllowGet
};
response = Request.CreateResponse(HttpStatusCode.BadRequest, jsonResult.Data);

これを行う方法?

28
user603007

いくつかのポイント:

単純なエラーメッセージを含むエラーレスポンスを返すことだけが必要な場合、Web APIはそのためのCreateErrorResponseメソッドを提供します。だからあなたは簡単に行うことができます:

return Request.CreateErrorResponse(HttpStatusCode.BadRequest, 
                                   "An error just happened");

これにより、次のHTTP応答が生成されます(簡潔にするため、他のヘッダーは省略されています)。

HTTP/1.1 400 Bad Request
Content-Type: application/json; charset=utf-8
Content-Length: 36

{"Message":"An error just happened"}

代わりにカスタムオブジェクトを返す場合は、Request.CreateResponseを使用しますが、MVC JsonResultは使用しません。代わりに、オブジェクトをCreateResponseに直接渡します。

var myError = new
{
    Data = "An error just happened",
    OtherDetails = "foo bar baz"
};

return Request.CreateResponse(HttpStatusCode.BadRequest, myError);

今、あなたはこれをしているが、サーバーからJSONを取得していないと言ってください。 Web APIは通常、コンテンツタイプネゴシエーションを使用して、応答を返送するときに使用する形式を決定することを理解することが重要です。つまり、クライアントがリクエストとともに送信したAcceptヘッダーを調べます。たとえば、Acceptヘッダーにapplication/xmlが含まれている場合、Web APIはXMLを返します。ヘッダーにapplication/jsonが含まれている場合、JSONを返します。したがって、クライアントが正しいAcceptヘッダーを送信していることを確認する必要があります。

そうは言っても、それが本当に必要な場合は、常に特定の形式でデータを返すようにWeb APIを強制する方法があります。コンテンツタイプも指定するCreateResponseの異なるオーバーロードを使用して、メソッドレベルでこれを行うことができます。

return Request.CreateResponse(HttpStatusCode.BadRequest, myError, 
    new System.Net.Http.Headers.MediaTypeHeaderValue("application/json"));

または、WebApiConfigファイルの構成からXMLフォーマッタを完全に削除できます。

config.Formatters.Remove(config.Formatters.XmlFormatter);

これにより、クライアントが要求するものに関係なく、Web APIは常にJSONを使用するようになります。

61
Brian Rogers

以下のようなJSONを返すことができます。

 return Request.CreateResponse<ResponseApiModel>(HttpStatusCode.BadRequest, response);

Apiのメソッドの戻り値の型がIHttpActionResultの場合、HttpResponseMessageの代わりにメソッドの戻り値の型で IHttpActionResult を使用することをお勧めします。のように返すことができます。

 return Content(HttpStatusCode.InternalServerError, response);

エラーを返す のベストプラクティスに関するリンクも確認できます。特に@Daniel Littleの答えは非常に便利です。

私は答えが遅く追加されたことを知っていますが、多分誰かの代わりになるかもしれません。

7
arslanaybars

JsonResultはMVCの概念です。 Web APIでは機能しません。 JSONコンテンツを明示的に返す1つの方法は、この回答で作成したクラスを使用することです https://stackoverflow.com/a/20504951/6819

1
Darrel Miller

追加config.Formatters.Remove(config.Formatters.XmlFormatter); WebApiConfigファイルの行

0
Amit Nikam