aspnet core 全局模型验证,统一api响应

上手就来

新建一个模型验证过滤器,其中ApiResp是自定义的统一响应类。

public class VldFilter:IActionFilter
    {
        /// <summary>
        /// 执行到action时
        /// </summary>
        /// <param name="context"></param>
        public void OnActionExecuting(ActionExecutingContext context)
        {
            if (!context.ModelState.IsValid)
            {
                ApiResp result = new ApiResp(ApiRespCode.F400000)
                {
                };
                StringBuilder errTxt = new StringBuilder();
                foreach (var item in context.ModelState.Values)
                {
                    foreach (var error in item.Errors)
                    {
                        errTxt.Append(error.ErrorMessage + "|");
                    }
                }
                if(errTxt.Length>0)
                {
                    result.Message= errTxt.ToString().Substring(0, errTxt.Length - 1);
                }
                context.Result = new JsonResult(result);
            }
        }

        public void OnActionExecuted(ActionExecutedContext context)
        {
        }

    }

ApiResp大概长这样,响应code使用自定义的枚举,从000000到999999,有足够的空间满足不同类型的响应码。

public class ApiResp
    {
        public bool Success;

        public string SysTime;

        public string Code;

        public string Message;

        public object Data;
    }

在startup设置Mvc options

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc(options =>
    {
        options.MaxModelValidationErrors = 5;
        options.Filters.Add<VldFilter>();
    }).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}

写一个SayHello接口测试一下,然而返回数据并不是ApiResp类型,仍然是默认的返回类型。貌似并没有执行自定义过滤器。

将Api控制器改为MVC控制器,取消[ApiController]特性,并将继承类由ControllerBase改为Controller。

  查看一下ControllerControllerBase的差别,Controller有继承ControllerBaseIActionFilterControllerBase是一个基类,没有任何继承类。

正确姿势

在startup设置ApiBehaviorOptions,启用自定义模型验证。

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc(options =>
    {
        options.MaxModelValidationErrors = 5;
        options.Filters.Add<VldFilter>();
    }).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

    services.Configure<ApiBehaviorOptions>(options =>
    {
        options.SuppressModelStateInvalidFilter = true; // 使用自定义模型验证
    }
}

得到正确的响应类

另一种正确姿势

这样设置,不需要额外的VldFilter。

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc(options =>
    {
        options.MaxModelValidationErrors = 10;
        //options.Filters.Add<VldFilter>();
    }).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
    // 实现统一模型验证,无须VldFilter。
    services.Configure<ApiBehaviorOptions>(options =>
    {        //options.SuppressModelStateInvalidFilter = true; // 使用自定义模型验证

        options.InvalidModelStateResponseFactory = (context) =>
        {
            ApiResp result = new ApiResp(ApiRespCode.F400000)
            {
            };
            StringBuilder errTxt = new StringBuilder();
            foreach (var item in context.ModelState.Values)
            {
                foreach (var error in item.Errors)
                {
                    errTxt.Append(error.ErrorMessage + "|");
                }
            }
            if (errTxt.Length > 0)
            {
                result.Message = errTxt.ToString().Substring(0, errTxt.Length - 1);
            }
            return new JsonResult(result);
        };

    });
}

原文地址:https://www.cnblogs.com/fallTakeMan/p/11668118.html

时间: 2024-11-05 23:38:16

aspnet core 全局模型验证,统一api响应的相关文章

asp.net core 2.1的全局模型验证统一方案

网上的统一模型验证,有效到asp.net core 2.0 2.1的mvc还可以用 webapi嘛,想想就好,自己琢磨了一顿,才发现这东西应该这样玩 首先吧api上面的特性注释了 //[ApiController] 这个会干扰 然后把ControllerBase改为Controller 这样,你写的模型验证的统一过滤器才生效,缺一不可 如果不信,大可测试一下 原文地址:https://www.cnblogs.com/NCoreCoder/p/10114041.html

.Net Core 使用模型验证

再开发过程中免不了要去验证参数的合法性,模型验证就是帮助我们去验证参数的合法性,我们可以在需要验证的model属性上加上Data Annotations特性后就会自动帮我们在action前去验证输入数据的合法性. 定义一个Person类 public class PersonDto { public string Name { get; set; } public string Phone { get; set; } public int Age { get; set; } } Person类有

ASP.NET Core 2.2 WebApi 系列【八】统一返回格式(返回值、模型验证、异常)

现阶段,基本上都是前后端分离项目,这样一来,就需要前后端配合,没有统一返回格式,那么对接起来会很麻烦,浪费时间.我们需要把所有接口及异常错误信息都返回一定的Json格式,有利于前端处理,从而提高了工作效率. 一.准备工作 定义响应实体类 /// <summary> /// 响应实体类 /// </summary> public class ResultModel { /// <summary> /// 状态码 /// </summary> public in

.Net Core Web Api使用模型验证验证参数合法性

原文:.Net Core Web Api使用模型验证验证参数合法性 在接口开发过程中免不了要去验证参数的合法性,模型验证就是帮助我们去验证参数的合法性,我们可以在需要验证的model属性上加上Data Annotations特性后就会自动帮我们在action前去验证输入数据的合法性. 1.定义一个Person类 public class PersonDto { public string Name { get; set; } public string Phone { get; set; } p

.net core 中api 模型验证

AddControllers/AddMvc方法允许添加自定义ActionFilterAttribute进行过滤 文档中这么定义Filter: 可以创建自定义筛选器,用于处理横切关注点. 横切关注点的示例包括错误处理.缓存.配置.授权和日志记录. 筛选器可以避免复制代码. 例如,错误处理异常筛选器可以合并错误处理. 通过不同的接口定义,筛选器同时支持同步和异步实现. 同步筛选器在其管道阶段之前和之后运行代码. 例如,OnActionExecuting 在调用操作方法之前调用. OnActionEx

从零写一个Asp.net core手脚架(模型验证)

一个asp.net core项目,一定包含了各种的实体,在RESTful api里面,有很多的参数传递,不建立实体则大量的参数需要自定验证正确性,并且Action上面会写的密密麻麻的参数 在asp.net 2.0的时候,就推出了ModelState,顾名思义,这个是模型状态,用于验证实体对象的 如何模型验证 用法是在需要验证的地方打上继承了ValidationAttribute的特性,比如常见的RequiredAttribute,这个是验证对象是否存在 /// <summary> /// Ad

我这么玩Web Api(二):数据验证,全局数据验证与单元测试

目录 一.模型状态 - ModelState 二.数据注解 - Data Annotations 三.自定义数据注解 四.全局数据验证 五.单元测试   一.模型状态 - ModelState 我理解的ModelState是微软在ASP.NET MVC中提出的一种新机制,它主要实现以下几个功能: 1. 保存客户端传过来的数据,如果验证不通过,把数据返回到客户端,这样可以保存用户输入,不需要重新输入. 2. 验证数据,以及保存数据对应的错误信息. 3. 微软的一种DRY(Don't Repeat

ASP.NET Web API模型验证以及异常处理方式

ASP.NET Web API的模型验证与ASP.NET MVC一样,都使用System.ComponentModel.DataAnnotations. 具体来说,比如有:[Required(ErrorMessage="")][Range(0, 999)][Bind(Exclude="")][DisplayName("")][StringLength(1024)]... 验证扩展可以看这里:http://dataannotationsextens

ASP.NET Core 使用Cookie验证身份

ASP.NET Core 1.x提供了通过Cookie 中间件将用户主体序列化为一个加密的Cookie,然后在后续请求中验证Cookie并重新创建主体,并将其分配给HttpContext.User属性.如果您要提供自己的登录界面和用户数据库,可以使用作为独立功能的Cookie中间件. ASP.NET Core 2.x的一个主要变化是不再存在Cookie中间件.取而代之的是在Startup.cs文件中的Configure方法中的调用UseAuthentication方法会添加设置HttpConte