将详细消息添加到 ASP.NET Core 3.1 标准 JSON BadRequest 响应

Ser*_*nko 7 c# bad-request asp.net-core

我的 ASP.NET Core 3.1 应用程序中有一个控制器,该控制器BadRequest()在其中一种情况下返回。默认情况下它会生成 json 响应:

{
  "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
  "title": "Bad Request",
  "status": 400,
  "traceId": "|492dbc28-4cf485d536d40917."
}
Run Code Online (Sandbox Code Playgroud)

这太棒了,但我想添加detail带有特定消息的字符串值。

当我返回时BadRequest("msg"),响应是纯文本msg

当我这样做时BadRequest(new { Detail = "msg" }),响应是一个 json:

{
  "detail": "msg"
}
Run Code Online (Sandbox Code Playgroud)

哪个更好,但我也想保留原始的 json 数据。

我的目标是返回这样的响应:

{
  "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
  "title": "Bad Request",
  "detail": "msg",
  "status": 400,
  "traceId": "|492dbc28-4cf485d536d40917."
}
Run Code Online (Sandbox Code Playgroud)

有办法做到这一点吗?

Kir*_*kin 15

ControllerBase.Problem方法非常适合此目的下面是一个产生所需响应的示例:

public IActionResult Post()
{
    // ...

    return Problem("msg", statusCode: (int)HttpStatusCode.BadRequest);
}
Run Code Online (Sandbox Code Playgroud)

为了完整起见,以下是输出示例:

{
  "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
  "title": "Bad Request",
  "status": 400,
  "detail": "msg",
  "traceId": "|670244a-4707fe3038da8462."
}
Run Code Online (Sandbox Code Playgroud)