模型验证错误时会跳过 ExceptionFilter

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

我正在尝试让我的自定义

ExceptionFilterAttribute
在模型验证错误的情况下也执行。

目前它被跳过,例如我收到以下响应:

{
    "type":"https://tools.ietf.org/html/rfc7231#section-6.5.1",
    "title":"One or more validation errors occurred.",
    "status":400,
    "traceId":"0HN2SGEJJ6355:00000004",
    "errors":{
        "scope":[
            "The Scope field is required."
        ],
        "xxx":[
            "The XXX field is required."
        ]
    }

我的过滤器,没有关于

OnException
方法的提示:

public class ApiExceptionFilterAttribute : ExceptionFilterAttribute
{
      public override void OnException(ExceptionContext context)
      {
            // ...
      }
}

注册如下:

services.AddControllers(options => options.Filters.Add<ApiExceptionFilterAttribute>())

使用 dotnet 7。

asp.net-mvc asp.net-core exceptionfilterattribute
1个回答
0
投票

您应该使用 ActionFilterAttribute 而不是 ExceptionFilterAttribute。 根据微软的说法,动作过滤器在动作方法执行之前和之后运行。它用于验证传入数据、实现缓存或修改 HTTP 响应,包括标头、状态代码等...

异常过滤器: 将全局策略应用于写入响应正文之前发生的未处理异常。 它用于提供自定义异常处理逻辑,例如记录错误、返回特定错误响应或在响应客户端之前执行清理任务。

请记住在 Program.cs 中抑制模型状态无效过滤器,就像下面的示例一样:

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

并创建一个ValidateModelAttribute类。比如说

public class ValidateModelAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext context)
        {
            if (!context.ModelState.IsValid)
            {
                var details = new ValidationProblemDetails(context.ModelState)
                {
                    Detail = "Validatio Error",
                    Type = "https://tools.ietf.org/html/rfc7231#section-6.5.1"
                };

                context.Result = new BadRequestObjectResult(details);
            }
        }
    }

最后将其添加到program.cs中:

builder.Services.AddControllers(o=>o.Filters.Add<ValidateModelAttribute>());
© www.soinside.com 2019 - 2024. All rights reserved.