Web API 中的模型状态验证

ras*_*ali 2 c# validation asp.net-core asp.net-core-middleware asp.net-core-webapi

我有一个自定义模型验证器来验证和返回自定义验证消息。

public void Validate(Object instance) {
                // Perfom validations and thow exceptions if any
                   throw new ValidationException();
               }
Run Code Online (Sandbox Code Playgroud)

现在,我想使用我的自定义验证器来验证每个即将到来的请求。
中间件和 Fitlers 有httpcontext对象,我应该读取请求正文,解链,然后调用我的自定义验证器来执行验证。
我抑制了默认的自动 http 400 响应。

在对 Web API 的每个请求之前,是否有任何正确的方法来调用自定义验证器?

Nan*_* Yu 10

[ApiController]应用属性,ASP.NET核心自动处理通过返回的ModelState一个400错误的请求的响应人体模型验证错误:

自动 HTTP 400 响应

要禁用自动 400 行为,请将SuppressModelStateInvalidFilter属性设置为 true :

services.AddControllers()
    .ConfigureApiBehaviorOptions(options => 
    {   
        options.SuppressModelStateInvalidFilter = true;     
    });
Run Code Online (Sandbox Code Playgroud)

然后您可以创建全局操作过滤器来检查ModelState.IsValid并添加您的自定义模型验证,例如:

public class CustomModelValidate : ActionFilterAttribute {
    public override void OnActionExecuting(ActionExecutingContext context) {
        if (!context.ModelState.IsValid) {
            context.Result = new BadRequestObjectResult(context.ModelState);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

并全局注册它以将过滤器应用于每个请求。