【问题标题】:Return a data object with a BadRequestResult / BadRequestErrorMessageResult返回带有 BadRequestResult / BadRequestErrorMessageResult 的数据对象
【发布时间】:2019-02-19 08:04:34
【问题描述】:

我想返回一个包含错误详细信息的数据对象,带有 BadRequestErrorMessageResultBadRequestErrorMessageResult 对象,如下所示:

public IHttpActionResult Action(Model model)
{
  var validationResult = model.Validate();
  if (validationResult.Successful)
  {
    // this one's okay; it supports sending data with a 200
    return Ok(validationResult);
  }
  else
  {
    // However, how do I return a custom data object here
    // like so?
    // No such overload, I wish there was

    // return BadRequest(validationResult);
  }
}

ApiController.BadRequest() 方法的唯一三个重载是:

1. BadRequest();
2. BadRequest(string message);
3. BadRequest(ModelStateDictionary modelState);

即使使用#3,模型状态字典也是一个层层叠加的深度集合,但在其底部是一堆KeyValuePair<string, ModelError>,其中每个ModelError也只有一个@987654328 @ 或 Exception 对象。

因此,即使使用#3,我们也只能打包一个string 来发送,而不是像我想要的那样自定义对象。

我真的不是在问我该如何解决这种情况。我的问题是:.NET API 中是否存在重载或其他方式以向客户端发送带有 Bad Request HTTP 状态代码的对象?

我正在使用面向 .NET Framework 版本 4.6.1 的 ASP.NET Web API 版本 5.2.4。

【问题讨论】:

  • 获取您的自定义对象,将其序列化并使用第二个重载返回它。
  • @AndreiDragotoniu 谢谢。如果没有办法融入 .NET 框架,这就是我已经在考虑的事情之一。

标签: asp.net .net asp.net-web-api


【解决方案1】:

您可以使用Content<T>(...) 方法来执行此操作。它返回一个NegotiatedContentResult,它根据请求头(例如json、xml)进行序列化,并允许您指定HttpStatusCode

你可以这样使用它:

return Content(HttpStatusCode.BadRequest, myObject);

如果您愿意,您可以在控制器中创建自己的 BadRequest<T>(T obj) 方法作为包装器,然后您可以随意调用它:

public IHttpActionResult BadRequest<T>(T obj)
{
    return Content(HttpStatusCode.BadRequest, obj);
}

public IHttpActionResult Action()
{
    // do whatever validation here.
    var validationResult = Validate();

    // then return a bad request
    return BadRequest(validationResult);
}

【讨论】:

  • 哇!刚刚在一个示例项目中尝试过,它可以工作。为什么我没查?非常感谢。
  • 不用担心,我只是自己发现的,因为我有类似的问题!在偶然发现这种方法之前,我正在考虑做各种复杂的事情。
【解决方案2】:

您可以以 JSON 格式构建/格式化字符串,将其作为字符串传递到 BadRequest() 参数中,然后再次将其转换为 JSON 或调用者后端的任何对象。

没试过,但是应该可以的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-10
    • 2018-02-25
    • 2022-01-01
    • 2020-02-11
    • 1970-01-01
    • 2020-03-28
    • 2019-03-14
    • 1970-01-01
    相关资源
    最近更新 更多