如何在asp.net web api中返回json错误消息?

use*_*007 28 c# json json.net asp.net-web-api

我想返回一个json errormessage但是在fiddler中,我在json面板中看不到这个:

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

这该怎么做?

Bri*_*ers 62

几点:

如果您要做的只是返回包含简单错误消息的错误响应,Web API会CreateErrorResponse为此提供一种方法.所以你可以简单地做:

return Request.CreateErrorResponse(HttpStatusCode.BadRequest, 
                                   "An error just happened");
Run Code Online (Sandbox Code Playgroud)

这将导致以下HTTP响应(为简洁起见,省略了其他标头):

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

{"Message":"An error just happened"}
Run Code Online (Sandbox Code Playgroud)

如果你想要返回一个自定义对象,那么你Request.CreateResponse就像使用一样,但不要使用MVC JsonResult.相反,只需将您的对象直接传递给CreateResponse:

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

return Request.CreateResponse(HttpStatusCode.BadRequest, myError);
Run Code Online (Sandbox Code Playgroud)

现在,假设您正在执行此操作,但您没有从服务器获取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"));
Run Code Online (Sandbox Code Playgroud)

或者,您可以在WebApiConfig文件中完全从配置中删除XML格式化程序:

config.Formatters.Remove(config.Formatters.XmlFormatter);
Run Code Online (Sandbox Code Playgroud)

无论客户端要求什么,这都会强制Web API始终使用JSON.

  • 这不适合我编译.我得.."无法从'<anonymous type:string errors>'转换为'string'" (4认同)

ars*_*ars 8

你可以像下面那样返回JSON,

 return Request.CreateResponse<ResponseApiModel>(HttpStatusCode.BadRequest, response);
Run Code Online (Sandbox Code Playgroud)

如果您的api方法返回类型是IHttpActionResult,我建议在方法返回类型上使用IHttpActionResult而不是HttpResponseMessage.你可以回报;

 return Content(HttpStatusCode.InternalServerError, response);
Run Code Online (Sandbox Code Playgroud)

你也可以查看关于错误返回的最佳实践的链接特别是@Daniel Little的答案非常有用.

我知道答案很晚才增加,但也许会有人站得住.


Dar*_*ler 1

JsonResult 是一个 MVC 概念。它在 Web API 中不起作用。显式返回 json 内容的一种方法是使用我在此答案中创建的类/sf/answers/1435346601/