【发布时间】:2026-01-08 18:45:01
【问题描述】:
虽然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);
};
});
【问题讨论】:
-
400 表示请求本身是错误的。您所谓的解决方法是自定义 400 响应的记录方式。这不是解决方法。您在自己的问题中发布的链接中对此进行了解释
-
您的兼容版本是多少(由
SetCompatibilityVersion设置)? -
@PanagiotisKanavos 我认为
SuppressUseValidationProblemDetailsForInvalidModelStateResponses是这样做的方法,但它对我不起作用。它可用是有原因的,但我似乎无法让它工作。顺便说一句,我同意 400 对无效数据不是最好的,但框架就是这样做的,我会使用 422。 -
@ESG
CompatibilityVersion.Version_2_2
标签: c# asp.net-core asp.net-core-2.2