第五节:WebApi的三大过滤器
一. 基本说明
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的三大过滤器的更多相关文章
- 第三百九十五节,Django+Xadmin打造上线标准的在线教育平台—Xadmin集成富文本框
第三百九十五节,Django+Xadmin打造上线标准的在线教育平台—Xadmin集成富文本框 首先安装DjangoUeditor3模块 Ueditor HTML编辑器是百度开源的HTML编辑器 下载 ...
- 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网络知识 第十五节课 ...
- 并发编程概述 委托(delegate) 事件(event) .net core 2.0 event bus 一个简单的基于内存事件总线实现 .net core 基于NPOI 的excel导出类,支持自定义导出哪些字段 基于Ace Admin 的菜单栏实现 第五节:SignalR大杂烩(与MVC融合、全局的几个配置、跨域的应用、C/S程序充当Client和Server)
并发编程概述 前言 说实话,在我软件开发的头两年几乎不考虑并发编程,请求与响应把业务逻辑尽快完成一个星期的任务能两天完成绝不拖三天(剩下时间各种浪),根本不会考虑性能问题(能接受范围内).但随着工 ...
- Ext JS学习第十六天 事件机制event(一) DotNet进阶系列(持续更新) 第一节:.Net版基于WebSocket的聊天室样例 第十五节:深入理解async和await的作用及各种适用场景和用法 第十五节:深入理解async和await的作用及各种适用场景和用法 前端自动化准备和详细配置(NVM、NPM/CNPM、NodeJs、NRM、WebPack、Gulp/Grunt、G
code&monkey Ext JS学习第十六天 事件机制event(一) 此文用来记录学习笔记: 休息了好几天,从今天开始继续保持更新,鞭策自己学习 今天我们来说一说什么是事件,对于事件 ...
- android内部培训视频_第五节(1)_OA实战之登录界面
第五节(1):OA实战之登录界面 一.登录界面布局 1.背景图片 2.文本框 3.checkbox 4.按钮 暂未实现点击切换图片效果 <RelativeLayout xmlns:androi ...
- 基于Extjs的web表单设计器 第五节——数据库设计
这里列出表单设计器系列的内容,6.7.8节的内容应该在春节后才有时间出了.因为这周末就请假回老家了,准备我的结婚大事.在此提前祝大家春节快乐! 基于Extjs的web表单设计器 基于Extjs的web ...
- JAVA GC之标记 第五节
JAVA GC之标记 第五节 OK,我们继续昨天最后留下的问题,什么是标记?怎么标记? 第一个问题相信大家都知道,标记就是对一些已死的对象打上记号,方便垃圾收集器的清理. 至于怎么标记,一般有两种方 ...
- 第五节 面向连接传输:TCP
第五节 面向连接传输:TCP TCP概述RFCs:793,1122,1323,2018,2581 点对点: 一个发送方,一个接收方 可靠,按序的字节流: 无“报文边界”,无结构但有 ...
- VUE2.0实现购物车和地址选配功能学习第五节
第五节 单件商品金额计算和单选全选功能 1.vue精髓在于操作data模型来改变dom,渲染页面,而不是直接去改变dom 2.加减改变总金额功能: html:<div class="c ...
随机推荐
- php开发微信APP支付接口
之前在开发APP中用到了微信支付,因为是第一次用,所以中途也遇到了好多问题,通过查看文档和搜集资料,终于完成了该功能的实现.在这里简单分享一下后台php接口的开发实例. 原文地址:代码汇个人博客 ht ...
- SQLServer之创建DML AFTER UPDATE触发器
DML AFTER UPDATE触发器创建原理 触发器触发时,系统自动在内存中创建deleted表或inserted表,inserted表临时保存了插入或更新后的记录行,deleted表临时保存了删除 ...
- (转载)Python之道1-环境搭建与pycharm的配置django安装及MySQL数据库配置
近期做那个python的开发,今天就来简单的写一下开发路线的安装及配置, 开发路线 Python3.6.1+Pycharm5.0.6+Django1.11+MySQL5.7.18 1-安装Python ...
- 【任务】信息检索.MOOC学习
[博客导航] [信息检索导航] 任务 18年12月4日开始,快速浏览,学习中国大学MOOC平台上黄如花老师的<信息检索>课程. 关键动力 0.搜索是最基础的能力,需要系统学习并应用. 1. ...
- dotnetcore ueditor
dotnetcore ueditor https://github.com/durow/ueditornetcore http://www.cnblogs.com/durow/p/6116393.h ...
- Exp6 信息搜集与漏洞扫描 20165110
Exp6 信息搜集与漏洞扫描 20165110 一.实践目标 掌握信息搜集的最基础技能与常用工具的使用方法. 二.实践内容 (1)各种搜索技巧的应用 (2)DNS IP注册信息的查询 (3)基本的扫描 ...
- 将docker镜像上传到docker hub
- 基于 HTML5 的 WebGL 自定义 3D 摄像头监控模型
前言 随着视频监控联网系统的不断普及和发展, 网络摄像机更多的应用于监控系统中,尤其是高清时代的来临,更加快了网络摄像机的发展和应用. 在监控摄像机数量的不断庞大的同时,在监控系统中面临着严峻的现状问 ...
- flask(三)之Flask-SQLAlchemy
01-介绍 Flask-SQLAlchemy是一个Flask扩展,简化了在Flask应用中使用SQLAlchemy的操作.SQLAlchemy提供了高层ORM,也提供了使用数据库原生SQL的低层功能. ...
- 只能用Android studio做平台移植了! 在Windows10下, 开发Android。
安装好IDE后, 会一直显示同步失败, 看看如下步骤: 需要注意的是: -> 安装NDK 自带的NDK版本有问题 自己去下一个15版本的 -> 按照系统提示一步一步安装其他 ...