自动化CodeReview系列目录

  1. 自动化CodeReview - ASP.NET Core依赖注入
  2. 自动化CodeReview - ASP.NET Core请求参数验证

参数验证实现

在做服务端开发时经常需要对客户端传入的参数进行合法性验证,在ASP.NET Core中通常会使用如下方式:

public class LoginModel
{
[Required(ErrorMessage = "账号不能为空")]
public string Account { get; set; }
[StringLength(, MinimumLength = , ErrorMessage = "密码长度应介于6-12个字符之间")]
public string Password { get; set; }
}
public IActionResult Login(LoginModel model)
{
if (ModelState.IsValid)
{
//参数校验通过,处理登陆逻辑
}
else
{
//参数校验失败,返回第一个错误
var firstErrorMsg = ModelState.GetFirstErrorMessage();
return Content(firstErrorMsg);
}
}

这么写虽然可以验证参数了,但还是要多写一个if...else...,能不能简化成只用一行代码就实现验证呢?

答案是:可以的,先看简化后的用法:

[ValidateModel]
public IActionResult Login(LoginModel model)
{
//能执行到此处表示参数已验证通过
}

以上代码如果Account传空会返回:

{
"errCode": ,
"errMsg": "账号不能为空"
}

与之前的区别是在Action上加了一个[ValidateModel],参数校验逻辑在ValidateModelAttribute里处理,这是MVC里Action过滤器的用法,篇幅限制我就不展开了,直接上代码:

namespace Mondol.WPDental.Web.Filters
{
/// <summary>
/// 确保当前Action的Model是已验证的,否则返回错误响应结果
/// </summary>
public class ValidateModelAttribute : Attribute, IActionFilter
{
public void OnActionExecuting(ActionExecutingContext context)
{
if (!context.ModelState.IsValid)
{
var result = new Result(ResultErrorCodes.ArgumentBad, context.ModelState.GetFirstErrorMessage());
context.Result = new JsonResult(result);
}
} public void OnActionExecuted(ActionExecutedContext context)
{
}
}
}

使用ValidateModel需要保证:

1. 项目中有统一的返回格式;例如:JSON或XML

2. 所有接口有统一的公共字段;例如:

{
"errCode": , //0成功,其它值失败
"errMsg": "失败时的错误消息",
"data": {
//成功时的返回数据

}
}

其实对于优秀的项目架构设计,以上2点都不是问题,只有“统一”才可以更好的抽象化代码,封装通用框架。

写到这里其实还不完美,如果Login上的[ValidateModel]忘加了呢?

编译也能通过,测试时还不容易发现。但这实实在在是个BUG,没有校验参数合法性啊。

自动化CodeReview之AutoReview

  我始终坚信再牛掰的程序员也有疏忽的时候,有时写着写着就忘加了。

能不能在忘加的时候提醒一下呢?答案是:可以的。

本系列的第1篇我写了关于【ASP.NET Core依赖注入】的自动化CodeReview,在写参数验证自动化CodeView时我发现自动化CodeView其实有很多可写的。

为了将零散的代码整理到一起,也为了以后可以持续维护下去,我重开了一个项目,项目名暂定AutoReview,PS:大家如果有更好的名字欢迎赐教

项目代码我放到了github上,地址为:https://github.com/md-frank/AutoReview

先来看下它的用法:

先在Startup.ConfigureServices方法最后加入如下代码:

public void ConfigureServices(IServiceCollection services)
{
//注册服务代码放到此处 //此段放在最后
if (_env.IsDevelopment())
{
services.AddAutoReview(
new DependencyInjectionAssert(),
new ValidateModelAssert()
{
ValidateModelAttributeType = typeof(ValidateModelAttribute)
}
);
}
}

AddAutoReview方法接受一个IAssert数组,表示要使用的断言,目前支持2个断言DependencyInjectionAssert、ValidateModelAssert

然后在在Startup.Configure方法中加入如下代码:

public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory)
{
//使用AutoReview,代码位置任意
if (_env.IsDevelopment())
app.UseAutoReview();
}

至此如果任意断言验证失败,UseAutoReview方法都会抛出异常,并提示问题代码的具体位置,终止项目运行。

现在你就可以在开发过程中发现BUG了,解决问题后重新运行即可。

自动化CodeReview - ASP.NET Core请求参数验证的更多相关文章

  1. 自动化CodeReview - ASP.NET Core依赖注入

    自动化CodeReview系列目录 自动化CodeReview - ASP.NET Core依赖注入 自动化CodeReview - ASP.NET Core请求参数验证 我个人比较懒,能自动做的事绝 ...

  2. 配置 ASP.NET Core 请求(Request)处理管道

    配置 ASP.NET Core 请求(Request)处理管道 在本节中,我们将讨论使用中间件组件为 asp.net core 应用程序配置请求处理管道. 作为应用程序启动的一部分,我们要在Confi ...

  3. 使用JWT的ASP.NET CORE令牌身份验证和授权(无Cookie)——第1部分

    原文:使用JWT的ASP.NET CORE令牌身份验证和授权(无Cookie)--第1部分 原文链接:https://www.codeproject.com/Articles/5160941/ASP- ...

  4. 自研后端HTTP请求参数验证器服务ParamertValidateService

    好处:方便了后端对HTTP请求中参数进行核验,只需一次编写效验器,一行代码便可对所有参数的pojo进行参数核验!而且更改效验逻辑时只需要更改效验器类即可,实现了解耦合. 只需要程序员按照规范开发一个P ...

  5. 使用Enablebuffering多次读取Asp Net Core 请求体

    使用Enablebuffering多次读取Asp Net Core 请求体 1 .Net Core 2.X时代 使用EnableRewind倒带 public IActionResult Index( ...

  6. ASP.NET Core 请求/查询/响应参数格式转换(下划线命名)

    业务场景: 在 ASP.NET Core 项目中,所有的代码都是骆驼命名,比如userName, UserName,但对于 WebApi 项目来说,因为业务需要,一些请求.查询和响应参数的格式需要转换 ...

  7. ASP.NET Core 使用Cookie验证身份

    ASP.NET Core 1.x提供了通过Cookie 中间件将用户主体序列化为一个加密的Cookie,然后在后续请求中验证Cookie并重新创建主体,并将其分配给HttpContext.User属性 ...

  8. asp.net core webApi 参数保护

    asp.net core webApi 参数保护 Intro asp.net core data protection 扩展,基于 IDataProtector 扩展的数据保护组件,自动化的实现某些参 ...

  9. 理解ASP.NET Core - 模型绑定&验证(Model Binding and Validation)

    注:本文隶属于<理解ASP.NET Core>系列文章,请查看置顶博客或点击此处查看全文目录 模型绑定 什么是模型绑定?简单说就是将HTTP请求参数绑定到程序方法入参上,该变量可以是简单类 ...

随机推荐

  1. Objective C HMAC-MD5

    - (NSString*) HMACWithSecret:(NSString*) secret andString:(NSString *)str { unsigned long encode = C ...

  2. iOS制作毛玻璃效果

    //添加一个图片 UIImageView *imageview = [[UIImageView alloc]init]; imageview.frame = CGRectMake(10, 100, 3 ...

  3. s3c2440的GPIO驱动

    多个通用的GPIO,同时这些端口也拥有一些复用功能(如ADC输入),有部分端口只能输入,有部分端口只能输出,今天我们来看看如何设置一个GPIO的输出电平以及如何获取一个端口的GPIO电平 对GPIO进 ...

  4. 浅谈IOS8之size class

    文章目录 1. 简介 2. 实验 3. 实战 3.1. 修改 Constraints 3.2. 安装和卸载 Constraints 3.3. 安装和卸载 View 3.4. 其他 4. 后话 以前和安 ...

  5. DOM:文档对象模型 --树模型

    文档:标签文档,对象:文档中每个元素对象,模型:抽象化的东西 一:window: 属性(值或者子对象):opener:打开当前窗口的源窗口,如果当前窗口是首次启动浏览器打开的,则opener是null ...

  6. bmp图片显示

    文件IO项目: 在开发板屏幕上循环显示目录里的图片 a.按照一定的间隔循环显示目录里的bmp图片 b.实现手指滑动来显示目录里的图片(bmp,jpg)上一张,下一张 d1: 1.能操控屏幕(查询开发板 ...

  7. 使用IDA静态分析解密《舰娘Collection》的lua脚本

    好久没写东西了,换工作之后忙得一比.你说创业?风太大没听清啊看了看以前写的东西,觉得以前写得太严肃了,从现在开始要轻松一点,要做一名逗逼码农. 本文不会介绍破解的细节,最终完成破解所编写的代码也不会公 ...

  8. LCA 倍增

    最近公共祖先 对于有根树T的两个结点u.v,最近公共祖先LCA(T,u,v)表示一个结点x,满足x是u.v的祖先且x的深度尽可能大. #include<cstdio> #include&l ...

  9. MyBatis与Spring集成

    beans.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="htt ...

  10. js控制公共模板中,不同页面中的导航选中效果-判断当前的url

    用js的做法也很多.比较推荐的方法是判断当前的url,然后根据url在nav中的位置,来对nav中的某个导航增加选中样式,代码如下: <!doctype html> <html la ...