.Net6基础功能封装分享12(统一参数校验)

开发后台webapi接口,需要对接口传入的参数进行校验,如果传入的参数不符合验证规则,就直接返回参数错误,就需要封装统一参数校验过滤器;在.net6中,内置了DataAnnotations实现通过数据注解的方式对数据进行校验,提供了一些常用的数据注解,如必填、范围、邮箱、电话号码、长度、正则表达式等,也支持自定义校验规则,满足中小型项目的日常大部分的验证需求;如果项目中需要特别频繁和复杂严谨的数据校验需求,也可以集成第三方开源的FluentValidate库来使用。本文主要介绍DataAnnotations的实现方式;

首先编写参数校验过滤器ParamVerifyFilter,继承IAsyncActionFilter过滤器,重写OnActionExecutionAsync方法

public class ParamVerifyFilter : IAsyncActionFilter
{
    public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
    {
        //校验不通过,直接返回参数错误的错误码,终止执行,校验通过执行后续逻辑
        if (!context.ModelState.IsValid)
        {
            string errorMsg = context.ModelState.Keys.SelectMany(key =>
            context.ModelState[key].Errors.Select(x => x.ErrorMessage)).FirstOrDefault();
           var result =  ResultUtil.Error(CodeMsg.PARAMETER_ERROR, errorMsg);
            context.Result = new ContentResult
            {
                // 返回状态码设置为200,表示成功
                StatusCode = StatusCodes.Status200OK,
                // 设置返回格式
                ContentType = "application/json;charset=utf-8",
                Content = JsonConvert.SerializeObject(result)
            };
            await Task.CompletedTask;
        }
        else
        {
            await next();
        }
    }
}

将ParamVerifyFilter过滤器全局注册到服务中,关闭api的自动校验

webAppBuilder.Services.AddControllers(options =>
{
    //添加全局路由前缀
    string basePath = webAppBuilder.Configuration.GetValue<string>("BasePath");
    options.Conventions.Insert(0, new RouteConvention(new RouteAttribute(#34;{basePath}/")));

    //跨域过滤器
    options.Filters.Add<CorsFilter>();
    //控制器异常过滤器
    options.Filters.Add<ExceptionFilter>();
    //参数检验过滤器
    options.Filters.Add<ParamVerifyFilter>();
});
//关闭自动校验
webAppBuilder.Services.Configure<ApiBehaviorOptions>(options => options.SuppressModelStateInvalidFilter = true);

在参数实体类中,添加校验规则数据注解

内置的验证特性有:

  • [ValidateNever]:指示应将某一属性或参数排除在验证外。
  • [CreditCard]:验证属性是否有信用卡格式。 需要 jQuery Validation 附加方法。
  • [Compare]:验证模型中的两个属性是否匹配。
  • [EmailAddress]:验证属性是否有电子邮件格式。
  • [Phone]:验证属性是否有电话号码格式。
  • [Range]:验证属性值是否在指定范围内。
  • [RegularExpression]:验证属性值是否与指定的正则表达式匹配。
  • [Required]:验证字段是否不为 null。 请参阅 [Required] 属性,获取关于该特性的行为的详细信息。
  • [StringLength]:验证字符串属性值是否未超过指定长度限制。
  • [Url]:验证属性是否有 URL 格式。