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

问题描述 投票:0回答:1

虽然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);
  };
});
c# asp.net-core asp.net-core-2.2
1个回答
2
投票

“问题详细信息”对应于RFC 7807,这是尝试标准化HTTP API报告错误的方式。 SuppressUseValidationProblemDetailsForInvalidModelStateResponses没有具体说明实际验证错误的返回,只是RFC中讨论的标准位。

做你想做的事的唯一方法就是你已经完成的工作,即使用自定义工厂。这不是黑客攻击或解决方法:这是改变自动响应的文档化方法。

也就是说,抑制验证错误绝对没有意义。整个要点是告知客户端请求中出现的错误,以便客户端纠正这些错误。没有它,你只是砰地关上门,没有任何迹象表明什么是错的或如何解决它。

© www.soinside.com 2019 - 2024. All rights reserved.