如何在asp.net web api中返回json错误MSG
本文关键字:返回 json 错误 MSG api web asp net | 更新日期: 2023-09-27 17:52:17
我想返回一个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);
如何做到这一点?
几点说明:
如果您想要做的只是返回一个包含简单错误消息的错误响应,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);
我建议在你的方法返回类型上使用IHttpActionResult而不是HttpResponseMessage,如果你的api的方法返回类型是IHttpActionResult。可以返回;
return Content(HttpStatusCode.InternalServerError, response);
你也可以查看关于错误返回的最佳实践的链接,特别是@Daniel Little的答案真的很有用。
我知道答案有点晚了,但也许对某人有好处。
JsonResult是一个MVC概念。它不能在Web API中工作。显式返回json内容的一种方法是使用我在这个答案中创建的类https://stackoverflow.com/a/20504951/6819
添加 config.Formatters.Remove (config.Formatters.XmlFormatter);
我想这对你或其他人都有帮助。
定义你的自定义ApiController
public abstract class ApiController : System.Web.Http.ApiController
{
protected internal virtual BadRequestErrorMessageResult BadRequest(object message)
{
return new BadRequestErrorMessageResult(message);
}
}
定义自定义消息结果类
public class BadRequestErrorMessageResult : IHttpActionResult
{
private readonly object _message;
public BadRequestErrorMessageResult(object message)
{
_message = message;
}
public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
{
HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.BadRequest)
{
Content = new ObjectContent<object>(_message, new JsonMediaTypeFormatter(), "application/json")
};
return Task.FromResult(response);
}
}
使用自定义响应方法
// GET api/<controller>
[Authorize]
[HttpGet]
public IHttpActionResult Test()
{
return BadRequest(new
{
Succeeded = false,
Message = "An error occurred during processing, please contact the administrator!"
});
}
自定义报头错误状态码的响应数据
{"Succeeded":false,"Message":"An error occurred during processing, please contact the administrator!"}
可以直接通过response属性
设置当前HTTP响应的状态码。Response.StatusCod = (int)HttpStatusCode.BadRequest;
return Json(HttpStatusCode.BadRequest);