ASP.NET Web API 2 过滤器
Ø 前言
我们知道 ASP.NET Web API 过滤器,也是属于消息处理机制中的一部分。正因如此,我们经常使用它来完成对请求的授权验证、参数验证,以及请求的 Log 记录,程序异常捕获等。
1. 常用的四大过滤器
Ø ASP.NET Web API 2 中的所有过滤器位于 System.Web.Http.dll 中的 System.Web.Http.Filters 命名空间中,继承关系如下:

1. AuthenticationFilter:身份证验证过滤器,必须实现 IAuthenticationFilter 接口。微软推出了一套身份验证组件(ASP.NET Identity)就是采用了该过滤实现,该组件位于 System.Web.Http.Owin.dll 程序集,主要使用 System.Web.Http.HostAuthenticationFilter 过滤器,可参考:https://www.cnblogs.com/yidianfeng/p/7765984.html
2. AuthorizationFilter:授权过滤器,必须继承于 AuthorizationFilterAttribute 类,或实现 IAuthorizationFilter 接口。
3. ActionFilter:动作过滤器,必须继承于 ActionFilterAttribute 类,或者实现 IActionFilter 接口。
4. ExceptionFilter:异常过滤器,必须继承于 ExceptionFilterAttribute 类,或者实现 IExceptionFilter 接口。
Ø 注意:因为 Web API 与 MVC 中很多过滤器名称都相同,但过滤器位于的程序集和命名空间是不同的。MVC 中的过滤器位于 System.Web.Mvc.dll 中的 System.Web.Mvc 命名空间,这不能搞混了!
Ø 首先,我们来看下过滤器的执行顺序

1) 图中描述了4种过滤器的执行顺序,而每个执行过程中发生异常,都会被异常过滤器捕获。
2) 每当一个请求“进来”时,可能存在的三种响应结果:401,无访问权限,500,请求发生异常,200,请求成功。
Ø 过滤器的用法
1) 创建过滤器
1. AuthenticationFilter(身份验证过滤器)
它是最先执行的过滤器,一般用于对访问者的身份认证等。
/// <summary>
/// 身份验证过滤器特性。
/// </summary>
public class CustomAuthenticationFilterAttribute
: System.Web.Http.Filters.FilterAttribute, System.Web.Http.Filters.IAuthenticationFilter
{
public System.Threading.Tasks.Task AuthenticateAsync(System.Web.Http.Filters.HttpAuthenticationContext context, System.Threading.CancellationToken cancellationToken)
{
//这里完成身份验证...
return Task.FromResult(0);
}
public System.Threading.Tasks.Task ChallengeAsync(System.Web.Http.Filters.HttpAuthenticationChallengeContext context, System.Threading.CancellationToken cancellationToken)
{
return Task.FromResult(0);
}
}
2. AuthorizationFilter(授权过滤器)
授权过滤器通常用于控制接口访问权限,只有当访问权限满足时,才允许访问程序中的接口。用于提高程序的安全性,防止程序被恶意篡改。通常可以使用 Basic 认证、签名认证等。
/// <summary>
/// 授权过滤器特性。
/// </summary>
public class CustomAuthorizationFilterAttribute : System.Web.Http.Filters.AuthorizationFilterAttribute
{
/// <summary>
/// 在过程请求授权时调用。
/// </summary>
/// <param name="actionContext">操作上下文,它封装有关使用 System.Web.Http.Filters.AuthorizationFilterAttribute 的信息。</param>
public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext)
{
//这里完成请求权限的控制...
}
}
3. ActionFilter(动作过滤器)
动作过滤器中有两个方法,一个是 OnActionExecuting(),在调用 Action() 方法之前执行,另一个是 OnActionExecuted(),在调用 Action() 方法之后执行。
/// <summary>
/// 动作过滤器特性。
/// </summary>
public class CustomActionFilterAttribute : System.Web.Http.Filters.ActionFilterAttribute
{
/// <summary>
/// 在调用操作方法之前发生。
/// </summary>
/// <param name="actionContext">操作上下文。</param>
public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext)
{
//这里完成请求参数的验证...
}
/// <summary>
/// 在调用操作方法之后发生。
/// </summary>
/// <param name="actionExecutedContext">操作执行的上下文。</param>
public override void OnActionExecuted(System.Web.Http.Filters.HttpActionExecutedContext actionExecutedContext)
{
//这里完成请求日志的记录...
}
}
1. OnActionExecuting () 方法
通常可以在该方法中,完成对接口参数的效验。
2. OnActionExecuted () 方法
一般可以用于记录调用接口的 log。
4. ExceptionFilter(异常过滤器)
异常过滤器中一个 OnException() 方法,当程序发生异常时将被执行。通常可以用于监控程序异常,记录异常日志。
/// <summary>
/// 自定义异常过滤器特性。
/// </summary>
public class CustomExceptionFilterAttribute : System.Web.Http.Filters.ExceptionFilterAttribute
{
/// <summary>
/// 异常过滤器特性。
/// </summary>
/// <param name="actionExecutedContext">操作的上下文。</param>
public override void OnException(System.Web.Http.Filters.HttpActionExecutedContext actionExecutedContext)
{
//当程序发生异常时执行的代码...
actionExecutedContext.Response = actionExecutedContext.Request.CreateResponse(
System.Net.HttpStatusCode.InternalServerError,
string.Format("异常:【{0}】已被捕获", actionExecutedContext.Exception.Message));
}
}
2) 注册过滤器
1. 注册全局过滤器
在 WebApiConfig 类的 Register() 方法中注册,例如:
config.Filters.Add(new WebAPI2.Filter.Filters.CustomExceptionFilterAttribute());
config.Filters.Add(new WebAPI2.Filter.Filters.CustomActionFilterAttribute());
config.Filters.Add(new WebAPI2.Filter.Filters.CustomAuthorizationFilterAttribute());
config.Filters.Add(new WebAPI2.Filter.Filters.CustomAuthenticationFilterAttribute());
通常异常过滤、动作过滤器都是定义为全局过滤器。
2. 定义 Controller 或 Action 过滤器
我们需要为指定的 Controller 或 Action 单独设置过滤器时,也可以这样定义:
[WebAPI2.Filter.Filters.CustomActionFilter]
[WebAPI2.Filter.Filters.CustomAuthorizationFilter]
[RoutePrefix("api/values")]
public class ValuesController : ApiController
{ }
或者
[WebAPI2.Filter.Filters.CustomAuthorizationFilter]
public HttpResponseMessage Get(HttpRequestMessage request, int id)
{
return request.CreateResponse<string>(HttpStatusCode.OK, "Get Action 方法执行,id值为:" + id);
}
Ø 注意:过滤器不能在 FilterConfig 中的 RegisterGlobalFilters() 去注册,因为这里是注册 MVC 过滤器的。
ASP.NET Web API 2 过滤器的更多相关文章
- ASP.NET Web API 过滤器创建、执行过程(二)
ASP.NET Web API 过滤器创建.执行过程(二) 前言 前面一篇中讲解了过滤器执行之前的创建,通过实现IFilterProvider注册到当前的HttpConfiguration里的服务容器 ...
- ASP.NET Web API 过滤器创建、执行过程(一)
ASP.NET Web API 过滤器创建.执行过程(一) 前言 在上一篇中我们讲到控制器的执行过程系列,这个系列要搁置一段时间了,因为在控制器执行的过程中包含的信息都是要单独的用一个系列来描述的,就 ...
- 在asp.net web api中利用过滤器设置输出缓存
介绍 本文将介绍如何在asp.net web api中利用过滤器属性实现缓存. 实现过程 1,首先在web.config文件下appsettings下定义“CacheEnabled”和“CacheTi ...
- ASP.NET Web API Model-ActionBinding
ASP.NET Web API Model-ActionBinding 前言 前面的几个篇幅把Model部分的知识点划分成一个个的模块来讲解,而在控制器执行过程中分为好多个过程,对于控制器执行过程(一 ...
- ASP.NET Web API Model-ParameterBinding
ASP.NET Web API Model-ParameterBinding 前言 通过上个篇幅的学习了解Model绑定的基础知识,然而在ASP.NET Web API中Model绑定功能模块并不是被 ...
- ASP.NET Web API Model-ModelMetadata
ASP.NET Web API Model-ModelMetadata 前言 前面的几个篇幅主要围绕控制器的执行过程,奈何执行过程中包含的知识点太庞大了,只能一部分一部分的去讲解,在上两篇中我们看到在 ...
- ASP.NET Web API中的Controller
虽然通过Visual Studio向导在ASP.NET Web API项目中创建的 Controller类型默认派生与抽象类型ApiController,但是ASP.NET Web API框架本身只要 ...
- 《ASP.NET Web API 2框架揭秘》样章(PDF版本)
<ASP.NET Web API 2框架揭秘>(详情请见<新作<ASP.NET Web API 2框架揭秘>正式出版>)以实例演示的方式介绍了很多与ASP.NET ...
- 新作《ASP.NET Web API 2框架揭秘》正式出版
我觉得大部分人都是“眼球动物“,他们关注的往往都是目光所及的东西.对于很多软件从业者来说,他们对看得见(具有UI界面)的应用抱有极大的热忱,但是对背后支撑整个应用的服务却显得较为冷漠.如果我们将整个“ ...
随机推荐
- electron打包之真的恶心
用electron-packager进行打包 这个模块的文档写的真的垃圾 1.先看看首页的参数介绍 就是说必选参数就是源码路径和app名字和--platform还有--arch咯,而且源码路径也没说是 ...
- 「SDOI2014」数数 解题报告
「SDOI2014」数数 题目描述 我们称一个正整数 \(N\) 是幸运数,当且仅当它的十进制表示中不包含数字串集合 \(S\) 中任意一个元素作为其子串. 例如当 \(S=(\)22, 333, 0 ...
- HDU 5950 Recursive sequence(矩阵快速幂)
题目链接:Recursive sequence 题意:给出前两项和递推式,求第n项的值. 题解:递推式为:$F[i]=F[i-1]+2*f[i-2]+i^4$ 主要问题是$i^4$处理,容易想到用矩阵 ...
- nodejs的某些api~(二)crypto加密模块
就随便写写crypto模块,加密在node里面挺重要的,特别是密码,用户名都用crypto加密,在我写的那个作品里面,用户名密码的存储都是用crypto加密的,也没有深究里面的内容,想深究的同学可以看 ...
- POJ2018 Best Cow Fences 二分
实数折磨人啊啊啊啊啊啊啊 好,实数应该是最反人类的东西了...... 这个害得我调了0.5天才过. 大意是这样的:给你一个数列,求其中不少于f个的连续数的最大平均值. 不禁想起寒假的课程来... 此处 ...
- [luoguU48834][count]
题目链接 思路 这个题可以考虑用全部情况减去不合法的情况,来求解.首先需要知道n个点所组成的图总共有\(C(_n^2)\)种,然后用f[n]表示n个点的图联通的方案数. 然后钦定1在联通图里面,考虑不 ...
- css之文本两端对齐
在进行网页设计时,我们经常会看到这样的样式:文本两端对齐. css为我们提供了一个属性可以实现这样的效果:text-align: justify.不过这个只能用来设置多行文本(除最后一行).如果只有单 ...
- jmeter-录制, 编辑脚本,性能测试全过程review
录制脚本 jmeter下载安装略过不谈,上步骤: 1.在测试计划新建-threads-线程组 2.在工作台新建-非测试原件-http代理服务器,设置端口和包含网址 不包含网址 3.在手机/浏览器,设置 ...
- (叉积,线段判交)HDU1086 You can Solve a Geometry Problem too
You can Solve a Geometry Problem too Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/3 ...
- nginx最简安装
在 CentOS 6.2 下安装nginx 一:nginx所需依赖的安装 用yum安装依赖: yum -y install zlib zlib-devel openssl openssl-devel ...