随着web客户端的发展,现在很多公司都有专业的前端开发,做到系统前后端分离。ap.net后端典型的就是采用webapi,但是发现很多时候大家对webapi并不了解,这里我们来说说输入参数的验证。前一段时间我们项目组也开始使用webapi来开发接口,开发之初发现设计了很多输入参数的验证规则(不适用,不好用并且还不能满足需求),然后我们在写业务的方法还的调用参数的验证方法, 所以开发是很郁闷的,bug也很多。。。,后来才发现 网上已有类似的博客:http://www.cnblogs.com/r01cn/p/3193095.html

好我们先看效果图吧:

我们的请求对象中有2个属性,teamId和start,其中start可以为空,但是如果有值就必须是日期类型且有效,如这里的“2016-2-30“是无效日期,这里的teamid是DB里面一张表的主键,所以我们要创建自定义的验证规则访问数据库来验证其值得有效性。

自定义验证类:

  public class DBRecordCheckAttribute : ValidationAttribute
{
public DBRecordCheckAttribute(string filter)
{
Filter = filter;
}
public override string FormatErrorMessage(string name)
{
return "The value '" + this.ValueStr + "' is not valid for " + name;
} public override bool IsValid(object value)
{
ValueStr = value == null ? string.Empty : value.ToString();
if (string.IsNullOrEmpty(Filter))
return true;
DBContext db = new DBContext();
IDbCommand command = db.Database.Connection.CreateCommand();
command.CommandType = CommandType.Text;
command.CommandText = Filter;
var p1 = command.CreateParameter();
p1.ParameterName = "@p1";
p1.Value = value;
command.Parameters.Add(p1);
command.Connection.Open();
var result = Convert.ToInt32(command.ExecuteScalar());
command.Connection.Close();
return result>;
}
private string ValueStr { set; get; }
public string Filter { set; get; }
}

同时我们还需要一个ActionFilterAttribute的子类来实现验证,验证通过才能访问我们的action,实际中需要验证我们的身份如token, 建议token实时更新保证一次token只能被使用一次,防止api(更新、删除)被重复调用。

 public class ValidParameterAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext)
{
base.OnActionExecuting(actionContext);
bool vaildedtoken = false;
//
try
{
vaildedtoken = true;
var token = actionContext.Request.Headers.GetValues("token");
// valid token
}
catch { } if (!vaildedtoken || !actionContext.ModelState.IsValid) {
var errors = actionContext.ModelState.Values.Select(x => x.Errors);
List<string> errormsg = new List<string>();
foreach (var item in errors)
{
for (int i = 0; i < item.Count; i++)
{
errormsg.Add(item[i].ErrorMessage);
} }
var response = new HttpResponseMessage();
response.Content = new StringContent(string.Join("\n",errormsg.ToArray()));
response.StatusCode = HttpStatusCode.BadRequest;
throw new System.Web.Http.HttpResponseException(response); }
}
}

  使用如下:

    public class UserInfo {
[DBRecordCheckAttribute("SELECT COUNT(*) FROM [dbo].[qal_team] where[team_id]=@p1")]
public int teamId { set; get; }
[DataType(DataType.Date)]
public DateTime? start { set; get; }
}
[ValidParameter]
public class ValuesController : ApiController
{
// GET api/values
public IEnumerable<string> Get([FromUri] UserInfo info)
{
return new string[] { "value1", "value2" };
}
}

在我们的业务ValuesController没有任何的验证,code是不是比较整洁了。当我们做设计的时候,我们一定要熟悉我们所使用的平台和技术,不然就像我们项目组里面在自己的action里面去写参数验证的逻辑是不对的。

这里也还有 跟简单的写法:

http://www.cnblogs.com/r01cn/archive/2012/12/04/2801664.html

欢迎大家拍砖!

Asp.net WebAPI Request参数验证-请不要重复造轮子的更多相关文章

  1. ASP.NET WebAPI 11 参数验证

    在绑定完Action的所有参数后,WebAPI并不会马上执行该方法,而要对参数进行验证,以保证输入的合法性. ModelState 在ApiController中一个ModelState属性用来获取参 ...

  2. 自动化CodeReview - ASP.NET Core请求参数验证

    自动化CodeReview系列目录 自动化CodeReview - ASP.NET Core依赖注入 自动化CodeReview - ASP.NET Core请求参数验证 参数验证实现 在做服务端开发 ...

  3. ASP.NET WEBAPI 的身份验证和授权

    定义 身份验证(Authentication):确定用户是谁. 授权(Authorization):确定用户能做什么,不能做什么. 身份验证 WebApi 假定身份验证发生在宿主程序称中.对于 web ...

  4. ASP.NET WebApi实现Token验证

    记录笔记,在博客园中有很多实现Token的方法,这是我看过他们学到的,然后找到适合自己的解决方案,自己无聊总结一下学习经验写下的 WebApi后端接口实现Token验证 Token是在客户端频繁向服务 ...

  5. asp.net webapi 自定义身份验证

    /// <summary> /// 验证 /// </summary> /// Account API账号 /// TimeStamp 请求时间 /// Sign 所有请求参数 ...

  6. ASP.NET WebAPI 05 参数绑定

    ParameterBindingAttribute 在上一篇中重点讲了ModelBinderAttribute的使用场景.这一篇详细的讲一下ModelBinder背后的参数绑定原理. ModelBin ...

  7. nodejs获取ASP.Net WebAPI(IIS Windows验证)

    处理了很多天,终于使用Nodejs可以发出请求至WebAPI,能够正常处理数据了 首先加入npm包 npm install httpntlm 在app.js中加入代码 var httpntlm = r ...

  8. Asp.Net WebApi 使用OWIN架构后,出现 “没有 OWIN 身份验证管理器与此请求相关联(No OWIN authentication manager is associated with the request)” 异常的解决办法

    在Asp.Net WebApi 项目中使用OWIN模块之后,如果没有在OWIN的Startup类中配置认证方式,调用WebApi的相关Controller和Action就会出现如下异常: 出现错误. ...

  9. 在asp.net WebAPI 中 使用Forms认证和ModelValidata(模型验证)

    一.Forms认证 1.在webapi项目中启用Forms认证 Why:为什么要在WebAPI中使用Forms认证?因为其它项目使用的是Forms认证. What:什么是Forms认证?它在WebAP ...

随机推荐

  1. python语法(四)— 文件操作

    前面几天学习了一写python的基础语法,也学习了分支if,循环while和for.由于之前已经做过几年的开发了,所以我们知道,许多数据来源并不是靠键盘输入到程序中去的,而是通过数据库和文件来获取到的 ...

  2. HDU5919 SequenceⅡ

    从后向前建主席树,以位置为下标建树,然后查询区间出现次数的第k/2大即可. 复杂度O(nlogn) #include<bits/stdc++.h> using namespace std; ...

  3. hdu 4431 第37届ACM/ICPC 天津赛区现场赛A题 枚举

    题意:就是给了13张牌.问增加哪些牌可以胡牌.m是数字,s是条,p是筒,c是数字 胡牌有以下几种情况: 1.一个对子 +  4组 3个相同的牌或者顺子.  只有m.s.p是可以构成顺子的.东西南北这样 ...

  4. Codeforces 576D Flights for Regular Customers 矩阵快速幂+DP

    题意: 给一个$n$点$m$边的连通图 每个边有一个权值$d$ 当且仅当当前走过的步数$\ge d$时 才可以走这条边 问从节点$1$到节点$n$的最短路 好神的一道题 直接写做法喽 首先我们对边按$ ...

  5. @Transactional导致AbstractRoutingDataSource动态数据源无法切换的解决办法

    上午花了大半天排查一个多数据源主从切换的问题,记录一下: 背景: 项目的数据库采用了读写分离多数据源,采用AOP进行拦截,利用ThreadLocal及AbstractRoutingDataSource ...

  6. Android 9 patch 图片 (.9.png 格式图片) 的特点和制作(转)

    本文围绕 .9.png 格式图片讨论以下两个话题: 1. 该格式图片的特点 2. 制作方式 一 .9.png 格式的文件的特点 与传统的png 格式图片相比, 9.png 格式图片在图片四周有一圈一个 ...

  7. CSDN博客的积分计算方法和博客排名规律

    开通博客一段时间了,近期莫名其妙得获得"持之以恒"的勋章,看着日益增长的积分,既兴奋又好奇.本人对CSDN博客积分的计算方法非常疑惑,也不知当中怎么回事,好奇度娘一番,并结合CSD ...

  8. socket shutdown和close的区别

    http://www.jianshu.com/p/eecab8d50697 shutdown() doesn't actually close the file descriptor—it just ...

  9. android音乐播放器开发 SweetMusicPlayer 摇一摇换歌

    上一篇写了怎样在线匹配歌词,http://blog.csdn.net/huweigoodboy/article/details/39878063,如今来讲讲摇一摇功能开发. 相同用了一个Service ...

  10. C#写UTF8文件时指定是否含BOM头

    BOM的基本概念 在UCS 编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF.而FFFE在UCS中是不存在的字符,所以不应该出现在实 ...