如何在www.example.com web API中返回json错误消息asp.net?

3htmauhk  于 2022-12-15  发布在  .NET
关注(0)|答案(6)|浏览(147)

我想返回一个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);

如何做到这一点?

ffvjumwh

ffvjumwh1#

有几点:
如果您只想返回一个包含简单错误消息的错误响应,那么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的不同重载来实现这一点,CreateResponse还指定了内容类型:

return Request.CreateResponse(HttpStatusCode.BadRequest, myError, 
    new System.Net.Http.Headers.MediaTypeHeaderValue("application/json"));

或者,可以在WebApiConfig文件中将XML格式化程序从配置中完全删除:

config.Formatters.Remove(config.Formatters.XmlFormatter);

这将迫使API始终使用JSON,而不管客户端要求什么。

2exbekwf

2exbekwf2#

你可以像下面这样返回JSON

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

我建议在你的方法返回类型上使用IHttpActionResult而不是HttpResponseMessage,如果你的API的方法返回类型是IHttpActionResult的话。

return Content(HttpStatusCode.InternalServerError, response);

您还可以查看有关error returning最佳实践的链接,特别是@丹尼尔Little的回答非常有用。
我知道答案加得太晚了,但也许有人会有好处。

qyyhg6bp

qyyhg6bp3#

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

4xy9mtcn

4xy9mtcn4#

添加配置格式设置程序.删除(配置格式设置程序.XmlFormatter); WebApiConfig文件中的

lmyy7pcs

lmyy7pcs5#

我想这会对你或其他人有帮助。
定义自定义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!"}
niknxzdl

niknxzdl6#

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

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

字符串

相关问题