抑制ASP.NET Core的自动400响应中的验证错误

时间:2019-04-23 12:38:13

标签: c# asp.net-core asp.net-core-2.2

尽管automatic 400 response很有用,但我不想将验证错误发送给客户端。

这是响应正文:

{
  "errors": {
    "username": [
      "'username' must not be empty."
    ],
    ...more errors
  },
  "title": "One or more validation errors occurred",
  "status": 400,
  "traceId": "xxx:yyy"
}

但是我想要的是默认设置,没有错误:

{
  "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
  "title": "Bad Request",
  "status": 400,
  "traceId": "xxx:yyy"
}

我以为我要做的就是设置

options.SuppressUseValidationProblemDetailsForInvalidModelStateResponses = true;

...但是那什么也没做。

我不想禁用此功能,我只是想抑制验证错误。我该怎么办?


顺便说一句,我正在通过手动创建响应正文来使用变通方法,但我希望避免这种情况:

services.Configure<ApiBehaviorOptions>(apiBehaviorOptions => {
  apiBehaviorOptions.InvalidModelStateResponseFactory = actionContext => {
    var pd    = new ProblemDetails();
    pd.Type   = apiBehaviorOptions.ClientErrorMapping[400].Link;
    pd.Title  = apiBehaviorOptions.ClientErrorMapping[400].Title;
    pd.Status = 400;
    pd.Extensions.Add("traceId", actionContext.HttpContext.TraceIdentifier);
    return new BadRequestObjectResult(pd);
  };
});

1 个答案:

答案 0 :(得分:2)

“问题详细信息”对应于RFC 7807,它是对HTTP API报告错误的方式进行标准化的尝试。 SuppressUseValidationProblemDetailsForInvalidModelStateResponses并未专门涵盖实际验证错误的返回,仅涵盖了RFC中讨论的标准位。

做自己想做的唯一方法就是已经做过的事情,即使用自定义工厂。这不是黑客或解决方法:这是记录在案的更改自动响应的方法。

也就是说,抑制验证错误绝对是零意义。整个重点是要通知客户请求中存在哪些错误,以便客户可以更正这些错误。没有这个,您就是在砸门,没有任何迹象表明问题出在哪里或如何修复。