【问题标题】:how to return json error msg in asp.net web api?如何在 asp.net web api 中返回 json 错误消息?
【发布时间】: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);

如何做到这一点?

【问题讨论】:

    标签: c# json asp.net-web-api json.net


    【解决方案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://stackoverflow.com/a/20504951/6819

        【讨论】:

          猜你喜欢
          • 2020-09-07
          • 1970-01-01
          • 2021-11-27
          • 1970-01-01
          • 2015-01-29
          • 1970-01-01
          • 1970-01-01
          • 2017-09-25
          • 1970-01-01
          相关资源
          最近更新 更多