对外公开WEB接口时,对模型校验是常见的安全常识,常见的写法是在controller中判断ModelState.IsValid,以注册用户API为例。

Model:

public class RegisterCustomerModel
{
[Required(ErrorMessage = "姓名不能为空")]
[StringLength(,ErrorMessage = "姓名长度不能超过10个字")]
public string Name { get; set; } [Required(ErrorMessage = "电话不能为空")]
[RegularExpression(@"^1[34578]\d{9}$", ErrorMessage = "电话号码格式不正确")]
public string Phone { get; set; } [Required(ErrorMessage = "密码不能为空")]
[StringLength(, ErrorMessage = "密码长度不能超过48个字符")]
public string Password { get; set; } }

打印校验失败的错误消息代码:

public static class ModelStateExtension
{
public static string ToErrorMessage(this ModelStateDictionary modelStateDictionary)
{
var stringBuilder = new StringBuilder(); foreach (var value in modelStateDictionary.Values)
{
foreach (var error in value.Errors)
{
stringBuilder.AppendLine(error.ErrorMessage);
}
} return stringBuilder.ToString();
}
}

Controller:

public ResponseProtocol Register(RegisterCustomerModel registerCustomerModel)
{
if (!ModelState.IsValid)
{
return new ResponseProtocol((int)ResponseResultEnum.ValidateError, ModelState.ToErrorMessage(), string.Empty);
} Customer customer = new Customer
{
Name = registerCustomerModel.Name,
Phone = registerCustomerModel.Phone,
WeiXinNo = registerCustomerModel.WeiXinNo,
Company = registerCustomerModel.Company,
UpdateTime = DateTime.Now
}; _customerService.Add(customer); return new ResponseProtocol((int)ResponseResultEnum.Success, "注册成功", string.Empty);
}

  以上写法是在controller里进行校验,缺点是每个需要进行校验的controller都要写一次,为了消除重复,可以将校验代码写入全局过滤器中,由过滤器进行统一模型校验,修改后的代码:

public class ValidationModelFilter : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
//get方法不进行模型校验
if (actionContext.Request.Method.Method=="GET")
{
return;
} if (!actionContext.ModelState.IsValid)
{
var error = JsonConvert.SerializeObject(new ResponseProtocol()
{
Code =(int)ResponseResultEnum.ValidateError,
Message = actionContext.ModelState.ToErrorMessage(),
Data = string.Empty
}); var httpResponseMessage = new HttpResponseMessage
{
Content = new StringContent(error)
}; httpResponseMessage.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
actionContext.Response = httpResponseMessage;
}
}
}

  然后在全局过滤器(WebApiConfig)注册一下: config.Filters.Add(new ValidationModelFilter());

ASP.NET WEB API 自定义模型校验过滤器的更多相关文章

  1. ASP.NET Web API 管道模型

    ASP.NET Web API 管道模型 前言 ASP.NET Web API是一个独立的框架,也有着自己的一套消息处理管道,不管是在WebHost宿主环境还是在SelfHost宿主环境请求和响应都是 ...

  2. ASP.NET Web API 自定义MediaType实现jsonp跨域调用

    代码来自<ASP.NET Web API 2 框架揭秘>一书. 直接上代码: /// <summary> /// 自定义jsonp MediaType /// </sum ...

  3. ASP.NET Web API编程——模型验证与绑定

    1.模型验证 使用特性约束模型属性 可以使用System.ComponentModel.DataAnnotations提供的特性来限制模型. 例如,Required特性表示字段值不能为空,Range特 ...

  4. ASP.NET Web API 自定义 HttpParameterBinding

    背景 问题的起因是这样的.群里面一个哥们儿发现在使用 ASP.NET WebAPI 时,不能在同一个方法签名中使用多次 FromBodyAttribute 这个 Attribute .正好我也在用 W ...

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

    ASP.NET Web API的模型验证与ASP.NET MVC一样,都使用System.ComponentModel.DataAnnotations. 具体来说,比如有:[Required(Erro ...

  6. Asp.Net Web API 2第七课——Web API异常处理

    前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok/p/3446289.html 本文主要来讲解Asp.Ne ...

  7. 【ASP.NET Web API教程】4.3 ASP.NET Web API中的异常处理

    原文:[ASP.NET Web API教程]4.3 ASP.NET Web API中的异常处理 注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本系列教程,请先看前面的内 ...

  8. Asp.Net Web API(四)

    HttpResponseException-----HTTP响应异常 如果Web API控制器抛出一个未捕捉的异常,会发生什么呢?在默认情况下,大多数异常都会转换为一个带有状态码500的内部服务器错误 ...

  9. ASP.NET Web API 控制器创建过程(一)

    ASP.NET Web API 控制器创建过程(一) 前言 在前面对管道.路由有了基础的了解过后,本篇将带大家一起学习一下在ASP.NET Web API中控制器的创建过程,这过程分为几个部分下面的内 ...

随机推荐

  1. java的List分页 取出数据后使用List分页

    以前一直是在DAO层直接从数据库里分页,但是今天因为有些数据,需要混合展示,就是根据条件取出了多个对象的集合,然后把这些多个List放到一个List里,然后在从这个List里进行分页. MemberA ...

  2. three.js粒子效果(分别基于CPU&GPU实现)

    前段时间做了一个基于CPU和GPU对比的粒子效果丢在学习WebGL的群里,技术上没有多作讲解,有同学反馈看不太懂GPU版本,干脆开一篇文章,重点讲解基于GPU开发的版本. 一.概况 废话不多说,先丢上 ...

  3. MyBatis源码解读(2)——MapperProxy

    SqlSession可以说是整个MyBatis的重中之重,在SqlSession中涉及到前一篇四大对象:Executor.StatementHandler.ParameterHandler.Resul ...

  4. java虚拟机学习-JVM调优总结-新一代的垃圾回收算法(11)

    垃圾回收的瓶颈 传统分代垃圾回收方式,已经在一定程度上把垃圾回收给应用带来的负担降到了最小,把应用的吞吐量推到了一个极限.但是他无法解决的一个问题,就是Full GC所带来的应用暂停.在一些对实时性要 ...

  5. Vue中过度动画效果应用

    一.实现动画过渡效果的几种方式 实现动画必须要将要进行动画的元素利用<transition>标签进行包裹 1.利用CSS样式实现过渡效果 <transition name=" ...

  6. ReactNative学习之Html基础

    前言: React Native开发作为一种新型的移动开发方式,个人觉得App的一部分需求会逐步替换成这种方式,也是公司移动开发人员所必须掌握的一种开发技术,所以鉴于这种情况我觉得很有必要学习一下,特 ...

  7. css3转盘抽奖

    做到一个活动,需要转盘抽奖,于是想到使用css3的动画效果,其中主要包含transition的动画过渡,transform的rotate的旋转效果,在这里只用到2d的旋转, 特别强调的是,因为需要和后 ...

  8. 你是否也在学习ES6 Promise时遇到过这个问题?

    背景 周末闲来无事,随便翻看了一下阮一峰老师的<ES6 标准入门>第2版,ps:之前在阮一峰老师的官网看过电子版,感觉干货满满,所以就买了纸质版:当看到第16章第4节 'Promise.p ...

  9. AES加密解密算法---java

    package com.BFGJ.AES; import java.util.Random; import java.util.StringTokenizer; import javax.crypto ...

  10. find的用法

    find在Linux系统中和其它工具,如sed.awk.grep等结合起来用,非常有用. 1.列出系统中所有属于root用户的“set uid”文件 #find / -perm 4755 –uid 0 ...