.NET 6 Web API 应用程序中的错误响应不一致

Inconsistent error response in .NET 6 Web API application

我无法找到如何抛出 .NET 6 Web 生成的异常 API。 如果我 return BadRequest(ModelState) 添加了错误,我不会收到包含状态、类型、标题等的相同消息。 默认情况下,.NET 在发生验证错误时生成此类错误:

{
"type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
"title": "One or more validation errors occurred.",
"status": 400,
"traceId": "00-488f8c0057223cbba92fc1fbfc8865d8-2341d7aba29d098f-00",
"errors": {
    "$": [
        "The JSON object contains a trailing comma at the end which is not supported in this mode. Change the reader options. Path: $ | LineNumber: 7 | BytePositionInLine: 0."
    ],
    "model": [
        "The model field is required."
    ]
}

}

我想配置我的应用程序以响应相同的错误 JSON,或者我想配置它以自定义 JSON 字段响应。

我尝试添加一个中间件来捕获异常,但它不处理模型错误(由框架本身处理)。我如何全局处理错误,或者我如何抛出将被视为与框架处理它们相同的异常?欢迎任何 documentation/tutorial 链接!

您可以像下面的代码一样禁用默认的错误请求响应:

builder.Services.Configure<ApiBehaviorOptions>(options =>
{
     options.SuppressModelStateInvalidFilter = true;
});

因此您可以 return 在 BadRequest 中使用任何您想要的模型。 但是,您必须在每个端点自己进行模型验证,例如:

[HttpPost(Name = "Post1")]
public IActionResult Post1(Model1 model)
{
    if (!ModelState.IsValid)
        return BadRequest(new CustomApiResponse());
   ...
}

[HttpPost(Name = "Post2")]
public IActionResult Post2(Model2 model)
{
    if (!ModelState.IsValid)
        return BadRequest(new CustomApiResponse());
   ...
}

如果你想 return 一个全局 JSON 结构,你可以用 ActionFilterAttribute 创建一个过滤器并将它用于你所有的端点,这样你就不需要做每个端点的模型验证。

自定义验证过滤器:

public class CustomValidationFilterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext context)
    {
        if (!context.ModelState.IsValid)
        {
            context.Result = new BadRequestObjectResult(new GlobalApiResponse());
        }

        base.OnActionExecuting(context);
    }
}

您需要在 Program.cs

中注册您的自定义过滤器
builder.Services.AddControllers(options =>
{
    options.Filters.Add(typeof(CustomValidationFilterAttribute));
});

这只是您可以用来实现您想要的效果的方法之一,您可以在 Internet 上找到不同的方法。

在 .Net6 Web Api 中,如果您想通过代码验证模型,并且可以调试它,只需这样做:

public class ModelValidationFilterAttribute : ActionFilterAttribute
{
    public override Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
    {
        if (!context.ModelState.IsValid)
        {
            context.Result = new BadRequestObjectResult(new BaseResponse() { code = ResponseCode.失败, msg = "" });
        }
        return base.OnActionExecutionAsync(context, next);
    }
}

然后在 Program.cs

中执行
// Add services to the container.
builder.Services.AddControllers(options =>
{
    //Add Your Filter
    options.Filters.Add<ModelValidationFilterAttribute>();
}).ConfigureApiBehaviorOptions(options =>
{
    //Disable The Default
    options.SuppressModelStateInvalidFilter = true;
});