繁体   English   中英

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

[英]how to return json error msg in asp.net web api?

我想返回 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提供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的不同重载在方法级别执行此操作, 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);

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

 return Content(HttpStatusCode.InternalServerError, response);

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

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

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

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

我认为这会对您或其他人有所帮助。

定义您的自定义 ApiController

public abstract class ApiController : System.Web.Http.ApiController
{
    protected internal virtual BadRequestErrorMessageResult BadRequest(object message)
    {
        return new BadRequestErrorMessageResult(message);
    }
}

定义自定义消息结果 class

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!"
        });
    }

带有自定义 header 错误状态代码的响应数据

{"Succeeded":false,"Message":"An error occurred during processing, please contact the administrator!"}

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM