如何在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);

如何做到这一点?

如何在asp.net web api中返回json错误MSG

几点说明:

如果您想要做的只是返回一个包含简单错误消息的错误响应,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);