私はjsonエラーメッセージを返したいのですが、現時点ではフィドラーではjsonパネルでこれを見ることができません:
string error = "An error just happened";
JsonResult jsonResult = new JsonResult
{
Data = error,
JsonRequestBehavior = JsonRequestBehavior.AllowGet
};
response = Request.CreateResponse(HttpStatusCode.BadRequest, jsonResult.Data);
これを行う方法?
いくつかのポイント:
単純なエラーメッセージを含むエラーレスポンスを返すことだけが必要な場合、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を使用するようになります。
以下のようなJSONを返すことができます。
return Request.CreateResponse<ResponseApiModel>(HttpStatusCode.BadRequest, response);
Apiのメソッドの戻り値の型がIHttpActionResultの場合、HttpResponseMessageの代わりにメソッドの戻り値の型で IHttpActionResult を使用することをお勧めします。のように返すことができます。
return Content(HttpStatusCode.InternalServerError, response);
エラーを返す のベストプラクティスに関するリンクも確認できます。特に@Daniel Littleの答えは非常に便利です。
私は答えが遅く追加されたことを知っていますが、多分誰かの代わりになるかもしれません。
JsonResultはMVCの概念です。 Web APIでは機能しません。 JSONコンテンツを明示的に返す1つの方法は、この回答で作成したクラスを使用することです https://stackoverflow.com/a/20504951/6819
追加config.Formatters.Remove(config.Formatters.XmlFormatter); WebApiConfigファイルの行