如何在 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 存储过程中获取返回值