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

Posted

技术标签:

【中文标题】如何在 asp.net web api 中返回 json 错误消息?【英文标题】:how to return json error msg in asp.net web api? 【发布时间】:2014-05-01 16:04:26 【问题描述】:

我想返回一个 json 错误消息,但目前在 fiddler 中我在 json 面板中看不到这个:

string error = "An error just happened";
JsonResult jsonResult = new JsonResult

     Data = error,
     JsonRequestBehavior = JsonRequestBehavior.AllowGet
;
response = Request.CreateResponse(HttpStatusCode.BadRequest, jsonResult.Data);

如何做到这一点?

【问题讨论】:

【参考方案1】:

添加 config.Formatters.Remove(config.Formatters.XmlFormatter); WebApiConfig 文件中的行

【讨论】:

【参考方案2】:

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

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

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

 return Content(HttpStatusCode.InternalServerError, response);

您还可以查看有关error returning 最佳实践的链接,尤其是@Daniel Little 的回答非常有用。

我知道答案添加到较晚,但可能对某人有利。

【讨论】:

带有'Content',返回的消息不是json格式。【参考方案3】:

可以通过Response属性直接设置当前HTTP响应的状态码

Response.StatusCod = (int)HttpStatusCode.BadRequest;
return Json(HttpStatusCode.BadRequest);

【讨论】:

【参考方案4】:

几点:

如果您只想返回包含简单错误消息的错误响应,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,而不管客户端要求什么。

【讨论】:

这个:新的 System.Net.Http.Headers.MediaTypeHeaderValue("application/json")。非常感谢。我正在寻找的确切缺失的部分。 这不适合我。我得到..“无法从''转换为'字符串'” @IanWarburton 看来您使用的是 Request.CreateErrorResponse 而不是 Request.CreateResponse 方法。 Request.CreateResponse 在 .net 6 api 中不起作用?【参考方案5】:

JsonResult 是一个 MVC 概念。它在 Web API 中不起作用。显式返回 json 内容的一种方法是使用我在此答案中创建的类https://***.com/a/20504951/6819

【讨论】:

以上是关于如何在 asp.net web api 中返回 json 错误消息?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Asp.net Core Web Api 中默认使用 Newtonsoft.Json?

在 ASP.NET Web API 中立即返回 HTTP 响应

ASP.Net Core Web API 如何返回 File。

如何从 ASP.NET Core Web API 中的 SQL Server 存储过程中获取返回值

使用 ASP.NET Web API,控制器如何返回使用 DotNetZip 库压缩的流图像集合?

如何在 ASP.NET MVC/Web 控制器中返回 JSON?