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

标签 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);
  };
});

最佳答案

“问题详情”对应RFC 7807,是对HTTP API报错方式进行标准化的一次尝试。 SuppressUseValidationProblemDetailsForInvalidModelStateResponses 并未具体涵盖实际验证错误的返回,仅涵盖 RFC 中讨论的标准位。

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

也就是说,抑制验证错误绝对没有意义。整个要点是通知客户请求中存在哪些错误,以便客户可以更正这些错误。如果没有它,您就只是砰地关上门,没有任何指示出了什么问题或如何解决问题。

关于c# - 抑制 ASP.NET Core 的自动 400 响应中的验证错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55811421/

相关文章:

c# - 强制执行所需的函数调用

asp.net-core - CSHTML View 在应用程序重新启动之前不会更新

c# - 在 ASP.NET Core 中测量异步与同步代码的性能

c# - 在 Controller 之外获取当前用户

c# - .Net 核心 & SynchronizationContext & Thread.SetData

c# - 具有 WinForm 和控制台界面的 .Net 程序

c# - 扁平化聚合异常以进行处理

entity-framework - 未强制执行 EF Core 并发

asp.net-core - HTTP 错误 500.30 - ASP.NET Core 2.2 中的 ANCM 进程内启动失败错误

c# - 如何创建属性以检查用户是否拥有 Identity core 2.2 的声明?