一. 基本说明

 1. 简介:

  WebApi下的过滤器和MVC下的过滤器有一些区别,首先我们要注意的是通常建WebApi项目时,会自动把MVC的程序集也引入进来,所以我们在使用WebApi下的过滤器的时候,要引入“ System.Web.Http”这个程序集,而不是MVC的“System.Web.MVC”。

PS:关于WebApi下的过滤器在的作用位置和使用方法以及执行顺序,均和MVC下的过滤器相似,详见:https://www.cnblogs.com/yaopengfei/p/7910763.html

2. 与MVC过滤器的区别

  由于WebApi只关注于方法,所以WebApi下没有结果过滤器, 详细分析: ActionFilterAttribute这个类并没有继承IResultFilter这个接口,只继承了IActionFilter这个接口,重写了OnActionExecuted和OnActionExecuting两个方法(包括对应的异步方法),并没有重写:OnResultExecuted和OnResultExecuting两个方法。

3. 过滤器的重写方法的执行顺序:

  OnAuthorization→OnActionExecuting-> Action方法执行 ->OnActionExecuted

二. 三大过滤器

1. 授权过滤器

  继承AuthorizeAttribute类,重写OnAuthorization方法,eg:MyAuthorize类.

  public class MyAuthorize : AuthorizeAttribute
{
public override void OnAuthorization(HttpActionContext actionContext)
{ //1.如果保留如下代码,则会运行.net framework定义好的身份验证,如果希望自定义身份验证,则删除如下代码
// base.OnAuthorization(actionContext); //2.获取控制器作用的Controller和action的名字
string controllerName = actionContext.ActionDescriptor.ControllerDescriptor.ControllerName.ToLower();
string actionName = actionContext.ActionDescriptor.ActionName.ToLower();
HttpContext.Current.Response.Write("身份验证过滤器作用于" + controllerName + "控制器下的" + actionName + "方法");
}
}

2. 行为过滤器

  继承ActionFilterAttribute,重写OnActionExecuting和OnActionExecuted方法,eg:MyAction类

  public class MyAction: ActionFilterAttribute
{
/// <summary>
/// 在Action方法运行之前调用
/// </summary>
/// <param name="actionContext"></param>
public override void OnActionExecuting(HttpActionContext actionContext)
{ //1.如果保留如下代码,则会运行.net framework定义好的行为验证,如果希望自定义行为验证,则删除如下代码
// base.OnActionExecuting(actionContext); //2.获取控制器作用的Controller和action的名字
string controllerName = actionContext.ActionDescriptor.ControllerDescriptor.ControllerName.ToLower();
string actionName = actionContext.ActionDescriptor.ActionName.ToLower();
HttpContext.Current.Response.Write("行为过滤器OnActionExecuting作用于" + controllerName + "控制器下的" + actionName + "方法运行之前");
} /// <summary>
/// 在Action方法运行之后调用
/// </summary>
/// <param name="actionExecutedContext"></param>
public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
base.OnActionExecuted(actionExecutedContext); //1.如果保留如下代码,则会运行.net framework定义好的行为验证,如果希望自定义行为验证,则删除如下代码
// base.OnActionExecuted(actionExecutedContext); //2.获取控制器作用的Controller和action的名字
string controllerName = actionExecutedContext.ActionContext.ControllerContext.ControllerDescriptor.ControllerName.ToLower();
string actionName = actionExecutedContext.ActionContext.ActionDescriptor.ActionName.ToLower();
HttpContext.Current.Response.Write("行为过滤器OnActionExecuted作用于" + controllerName + "控制器下的" + actionName + "方法运行之后");
}
}

  测试:用PostMan请求下面的CheckLogin方法,可以验证上面的执行顺序:OnAuthorization→OnActionExecuting-> Action方法执行 ->OnActionExecuted

3.异常个过滤器

  实现IExceptionFilter接口,继承FilterAttribute类(能以特性的形式作用),eg:MyException类.

 /// <summary>
/// 异常过滤器
/// </summary>
public class MyException : FilterAttribute,IExceptionFilter
{
//public bool AllowMultiple => throw new NotImplementedException(); public async Task ExecuteExceptionFilterAsync(HttpActionExecutedContext actionExecutedContext, CancellationToken cancellationToken)
{
//throw new NotImplementedException(); //1.获取异常信息
string errorMsg = actionExecutedContext.Exception.ToString(); //2.对获取的异常信息进行处理
using (StreamWriter writer = File.AppendText("d:/err.txt"))
{
await writer.WriteLineAsync(errorMsg);
} }
}

  测试: 用PostMan请求下面的CheckLogin2方法,手动制造错误,会进入异常过滤器中,获取错误,进行相应的处理.

!

  • 作       者 : Yaopengfei(姚鹏飞)
  • 博客地址 : http://www.cnblogs.com/yaopengfei/
  • 声     明1 : 本人才疏学浅,用郭德纲的话说“我是一个小学生”,如有错误,欢迎讨论,请勿谩骂^_^。
  • 声     明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
 

第五节:WebApi的三大过滤器的更多相关文章

  1. 第三百九十五节,Django+Xadmin打造上线标准的在线教育平台—Xadmin集成富文本框

    第三百九十五节,Django+Xadmin打造上线标准的在线教育平台—Xadmin集成富文本框 首先安装DjangoUeditor3模块 Ueditor HTML编辑器是百度开源的HTML编辑器 下载 ...

  2. centos Linux系统日常管理2 tcpdump,tshark,selinux,strings命令, iptables ,crontab,TCP,UDP,ICMP,FTP网络知识 第十五节课

    centos  Linux系统日常管理2  tcpdump,tshark,selinux,strings命令, iptables ,crontab,TCP,UDP,ICMP,FTP网络知识 第十五节课 ...

  3. 并发编程概述 委托(delegate) 事件(event) .net core 2.0 event bus 一个简单的基于内存事件总线实现 .net core 基于NPOI 的excel导出类,支持自定义导出哪些字段 基于Ace Admin 的菜单栏实现 第五节:SignalR大杂烩(与MVC融合、全局的几个配置、跨域的应用、C/S程序充当Client和Server)

    并发编程概述   前言 说实话,在我软件开发的头两年几乎不考虑并发编程,请求与响应把业务逻辑尽快完成一个星期的任务能两天完成绝不拖三天(剩下时间各种浪),根本不会考虑性能问题(能接受范围内).但随着工 ...

  4. Ext JS学习第十六天 事件机制event(一) DotNet进阶系列(持续更新) 第一节:.Net版基于WebSocket的聊天室样例 第十五节:深入理解async和await的作用及各种适用场景和用法 第十五节:深入理解async和await的作用及各种适用场景和用法 前端自动化准备和详细配置(NVM、NPM/CNPM、NodeJs、NRM、WebPack、Gulp/Grunt、G

    code&monkey   Ext JS学习第十六天 事件机制event(一) 此文用来记录学习笔记: 休息了好几天,从今天开始继续保持更新,鞭策自己学习 今天我们来说一说什么是事件,对于事件 ...

  5. android内部培训视频_第五节(1)_OA实战之登录界面

    第五节(1):OA实战之登录界面  一.登录界面布局 1.背景图片 2.文本框 3.checkbox 4.按钮 暂未实现点击切换图片效果 <RelativeLayout xmlns:androi ...

  6. 基于Extjs的web表单设计器 第五节——数据库设计

    这里列出表单设计器系列的内容,6.7.8节的内容应该在春节后才有时间出了.因为这周末就请假回老家了,准备我的结婚大事.在此提前祝大家春节快乐! 基于Extjs的web表单设计器 基于Extjs的web ...

  7. JAVA GC之标记 第五节

    JAVA GC之标记  第五节 OK,我们继续昨天最后留下的问题,什么是标记?怎么标记? 第一个问题相信大家都知道,标记就是对一些已死的对象打上记号,方便垃圾收集器的清理. 至于怎么标记,一般有两种方 ...

  8. 第五节 面向连接传输:TCP

    第五节 面向连接传输:TCP   TCP概述RFCs:793,1122,1323,2018,2581   点对点:   一个发送方,一个接收方   可靠,按序的字节流:   无“报文边界”,无结构但有 ...

  9. VUE2.0实现购物车和地址选配功能学习第五节

    第五节 单件商品金额计算和单选全选功能 1.vue精髓在于操作data模型来改变dom,渲染页面,而不是直接去改变dom 2.加减改变总金额功能: html:<div class="c ...

随机推荐

  1. Linux VMware新添加网络适配器找不到配置文件问题

    VMware centos 新添加网卡没有识别,在做 Linux 实验时经常遇到需要双网卡的情况,VMware 新添加网卡后Linux是不会主动创建 ifcfg-eth* 文件的,重启服务器和重启网络 ...

  2. log4j控制指定包下的日志

    最近观察日志发现如下两个问题: 1.项目用的是springboot项目,整合了rabbitmq,项目启动后,会自动监控rabbitmq谅解是否正常,导致控制台一直输出监控日志,此时就想阻止该类日志输出 ...

  3. jsonpath 使用教程(快速处理dict的深度查询)

    一 简介 JSONPath - 用于JSON的XPath 用来解析多层嵌套的json数据;JsonPath 是一种信息抽取类库,是从JSON文档中抽取指定信息的工具. 二 安装 安装方法:pip in ...

  4. CORS——跨域请求那些事儿

    在日常的项目开发时会不可避免的需要进行跨域操作,而在实际进行跨域请求时,经常会遇到类似 No 'Access-Control-Allow-Origin' header is present on th ...

  5. HTML5 canvas clearRect() 方法

    浏览器支持 Internet Explorer 9.Firefox.Opera.Chrome 以及 Safari 支持 clearRect() 方法. 注释:Internet Explorer 8 或 ...

  6. JSP七大动作

  7. 【转】从源码分析Handler的postDelayed为什么可以延时?

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/aliankg/article/details/70842494Thread/Hander/Loope ...

  8. Chrome Inspect调试微信出现404,需要FQ

    要么FQ,要么买个程序 见连接 http://www.cnblogs.com/slmk/p/7591126.html

  9. Jquery密码强度校验

    function passValidate(){ var password=$password.val().trim() if(password===""){ $mima.addC ...

  10. centos6.8 配置mysql赋予mysql远程连接权限

    1.关掉防火墙 2.检查3306端口是否开放 3.修改用户用户权限 GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '您的数据库密码' ...