自动化CodeReview - ASP.NET Core请求参数验证
自动化CodeReview系列目录
参数验证实现
在做服务端开发时经常需要对客户端传入的参数进行合法性验证,在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请求参数验证的更多相关文章
- 自动化CodeReview - ASP.NET Core依赖注入
自动化CodeReview系列目录 自动化CodeReview - ASP.NET Core依赖注入 自动化CodeReview - ASP.NET Core请求参数验证 我个人比较懒,能自动做的事绝 ...
- 配置 ASP.NET Core 请求(Request)处理管道
配置 ASP.NET Core 请求(Request)处理管道 在本节中,我们将讨论使用中间件组件为 asp.net core 应用程序配置请求处理管道. 作为应用程序启动的一部分,我们要在Confi ...
- 使用JWT的ASP.NET CORE令牌身份验证和授权(无Cookie)——第1部分
原文:使用JWT的ASP.NET CORE令牌身份验证和授权(无Cookie)--第1部分 原文链接:https://www.codeproject.com/Articles/5160941/ASP- ...
- 自研后端HTTP请求参数验证器服务ParamertValidateService
好处:方便了后端对HTTP请求中参数进行核验,只需一次编写效验器,一行代码便可对所有参数的pojo进行参数核验!而且更改效验逻辑时只需要更改效验器类即可,实现了解耦合. 只需要程序员按照规范开发一个P ...
- 使用Enablebuffering多次读取Asp Net Core 请求体
使用Enablebuffering多次读取Asp Net Core 请求体 1 .Net Core 2.X时代 使用EnableRewind倒带 public IActionResult Index( ...
- ASP.NET Core 请求/查询/响应参数格式转换(下划线命名)
业务场景: 在 ASP.NET Core 项目中,所有的代码都是骆驼命名,比如userName, UserName,但对于 WebApi 项目来说,因为业务需要,一些请求.查询和响应参数的格式需要转换 ...
- ASP.NET Core 使用Cookie验证身份
ASP.NET Core 1.x提供了通过Cookie 中间件将用户主体序列化为一个加密的Cookie,然后在后续请求中验证Cookie并重新创建主体,并将其分配给HttpContext.User属性 ...
- asp.net core webApi 参数保护
asp.net core webApi 参数保护 Intro asp.net core data protection 扩展,基于 IDataProtector 扩展的数据保护组件,自动化的实现某些参 ...
- 理解ASP.NET Core - 模型绑定&验证(Model Binding and Validation)
注:本文隶属于<理解ASP.NET Core>系列文章,请查看置顶博客或点击此处查看全文目录 模型绑定 什么是模型绑定?简单说就是将HTTP请求参数绑定到程序方法入参上,该变量可以是简单类 ...
随机推荐
- DM二维码识别库DMDECODER的使用--MFC例程
DM码和QR码是当今比较主流的二维码,其中QR码容量大,容量密度为16kb,DM码容量要小一点,可在仅仅25mm²的面积上编码30个数字,但是DM码的容错率更高,所以实际的工业生产中经常使用DM码作为 ...
- Cookie的格式及组成
转自:http://blog.csdn.net/talking12391239/article/details/9665185 Cookie由变量名和值组成,类似JavaScript变量.其属性里既有 ...
- <转>SQL的执行顺序
SQL 不同于与其他编程语言的最明显特征是处理代码的顺序.在大数编程语言中,代码按编码顺序被处理,但是在SQL语言中,第一个被处理的子句是FROM子句,尽管SELECT语句第一个出现,但是几乎总是最后 ...
- Python字符串的encode与decode研究心得——解决乱码问题
转~Python字符串的encode与decode研究心得——解决乱码问题 为什么Python使用过程中会出现各式各样的乱码问题,明明是中文字符却显示成“/xe4/xb8/xad/xe6/x96/x8 ...
- Android之Margin和Padding属性及支持的长度单位
做了个小软件后,终于把Margin和Padding弄清楚了,现总结如下: Android的Margin和Padding跟Html的是一样的.如下图所示:黄色部分为Padding,灰色部分为Margin ...
- iOS开发实现Label中多颜色多字体
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(8, 100, 300, 30)]; label.textColor = wor ...
- UVa 10299 - Relatives
题目大意:Euler's Totient的应用. 几乎和UVa 10179 - Irreducable Basic Fractions一样,于是偷了个懒,直接用10179题的代码,结果WA了,感觉一样 ...
- sql语句:创建事物
BEGIN TRAN Tran_Money --开始事务 DECLARE @tran_error int; ; BEGIN TRY WHERE Name = '刘备'; SET @tran_error ...
- 如何使用python timeit模块使用实践
其实平时使用测试应用运行时间的情况 细算一下还真的很少.很久没有做性能优化的工作,不管是cProfile还是timeit模块都已经生疏了很久没有使用,我在以前的文章里面有提到过cPfile的性能测试使 ...
- Git Flow——Git团队协作最佳实践
规范的Git使用 Git是一个很好的版本管理工具,不过相比于传统的版本管理工具,学习成本比较高. 实际开发中,如果团队成员比较多,开发迭代频繁,对Git的应用比较混乱,会产生很多不必要的冲突或者代码丢 ...