我正在尝试让我的自定义
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。
您应该使用 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>());