c# - 抑制 ASP.NET Core 的自动 400 响应中的验证错误
问题描述
尽管自动 400 响应很有用,但我不想将验证错误发送给客户端。
这是响应正文:
{
"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 中讨论的标准位。
做你想做的事情的唯一方法就是你已经做过的事情,即使用自定义工厂。这不是破解或解决方法:这是更改自动响应的记录方法。
也就是说,抑制验证错误绝对是零意义。整个重点是通知客户请求中存在哪些错误,以便客户可以纠正这些错误。没有它,你只是关上门,没有任何迹象表明出了什么问题或如何解决它。
推荐阅读
- javascript - 带 python 和烧瓶的装载机
- integer - 在没有双精度的情况下有效地确定一个点是在三角形内部还是在边缘上
- haskell - 更适合阅读 Haskell 中的科学记数法
- python - 如何从字典转换列表
- html - 缩小浏览器时在部分内容上显示响应式页脚
- c - 我如何使用指针在这个数组(函数)内部移动而不是数组订阅
- ruby-on-rails - 如何在 Rails 中每隔几秒运行 10 分钟?
- java - 检索类类型,并实例化一个新的相同类型
- javascript - 使用 REST API 创建内容版本后打开 Salesforce 文件时出错
- java - spring boot 启动错误