Ø  前言

我们知道 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 过滤器的更多相关文章

  1. ASP.NET Web API 过滤器创建、执行过程(二)

    ASP.NET Web API 过滤器创建.执行过程(二) 前言 前面一篇中讲解了过滤器执行之前的创建,通过实现IFilterProvider注册到当前的HttpConfiguration里的服务容器 ...

  2. ASP.NET Web API 过滤器创建、执行过程(一)

    ASP.NET Web API 过滤器创建.执行过程(一) 前言 在上一篇中我们讲到控制器的执行过程系列,这个系列要搁置一段时间了,因为在控制器执行的过程中包含的信息都是要单独的用一个系列来描述的,就 ...

  3. 在asp.net web api中利用过滤器设置输出缓存

    介绍 本文将介绍如何在asp.net web api中利用过滤器属性实现缓存. 实现过程 1,首先在web.config文件下appsettings下定义“CacheEnabled”和“CacheTi ...

  4. ASP.NET Web API Model-ActionBinding

    ASP.NET Web API Model-ActionBinding 前言 前面的几个篇幅把Model部分的知识点划分成一个个的模块来讲解,而在控制器执行过程中分为好多个过程,对于控制器执行过程(一 ...

  5. ASP.NET Web API Model-ParameterBinding

    ASP.NET Web API Model-ParameterBinding 前言 通过上个篇幅的学习了解Model绑定的基础知识,然而在ASP.NET Web API中Model绑定功能模块并不是被 ...

  6. ASP.NET Web API Model-ModelMetadata

    ASP.NET Web API Model-ModelMetadata 前言 前面的几个篇幅主要围绕控制器的执行过程,奈何执行过程中包含的知识点太庞大了,只能一部分一部分的去讲解,在上两篇中我们看到在 ...

  7. ASP.NET Web API中的Controller

    虽然通过Visual Studio向导在ASP.NET Web API项目中创建的 Controller类型默认派生与抽象类型ApiController,但是ASP.NET Web API框架本身只要 ...

  8. 《ASP.NET Web API 2框架揭秘》样章(PDF版本)

    <ASP.NET Web API 2框架揭秘>(详情请见<新作<ASP.NET Web API 2框架揭秘>正式出版>)以实例演示的方式介绍了很多与ASP.NET ...

  9. 新作《ASP.NET Web API 2框架揭秘》正式出版

    我觉得大部分人都是“眼球动物“,他们关注的往往都是目光所及的东西.对于很多软件从业者来说,他们对看得见(具有UI界面)的应用抱有极大的热忱,但是对背后支撑整个应用的服务却显得较为冷漠.如果我们将整个“ ...

随机推荐

  1. 「ZJOI2016」旅行者 解题报告

    「ZJOI2016」旅行者 对网格图进行分治. 每次从中间选一列,然后枚举每个这一列的格子作为起点跑最短路,进入子矩形时把询问划分一下,有点类似整体二分 至于复杂度么,我不会阿 Code: #incl ...

  2. Haproxy Nginx cluster构建

    -----client---------haproxy-------nginx1---------nginx2------192.168.1.250 192.168.1.1 192.168.1.10 ...

  3. [ZJOI2012]灾难(建图)

    阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,如果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从而引发一系列的生态灾难. 学过生物的阿米巴告诉小强,草 ...

  4. Fiddler 安装配置及使用技巧

    下载最新版即可: https://www.telerik.com/fiddler pc配置: pc端上的配置较为简单,主要是记录一下遇到的一些bug以及解决方法. options>HTTPS  ...

  5. 牛客OI周赛7-提高组 B小睿睿的询问(ST打表)

    链接:https://ac.nowcoder.com/acm/contest/371/B来源:牛客网 小睿睿的n个妹纸排成一排,每个妹纸有一个颜值val[i].有m个询问,对于每一个询问,小睿睿想知道 ...

  6. Python中的实例方法、classmethod和staticmethod的区别

    class NewsPaper(object): # 类属性 __print_times = 0 # 下划线表示私有属性 # 实例方法 def __init__(self, title, conten ...

  7. Java Scanner篇

    Scanner 翻译解释为扫描器 Java中用于控制台的的数据输入 包:import java.util.Scanner 使用方法:Scanner reader=new Scanner(System. ...

  8. Python之函数的本质、闭包、装饰器

    函数名的本质 函数名本质上就是函数的内存地址. 1.可以赋值给其他变量,被引用 def func(): print('in func') f = func print(f) 2.可以被当作容器类型的元 ...

  9. 【非专业前端】使用vue2.5.17+element2.4.5

    开发工具:WebStorm 先搞好环境 可以看出,想安装@vue/cli需要node.js.先去下载安装好. 然后安装@vue/cli npm install -g @vue/clinpm insta ...

  10. codeforces 540E"Infinite Inversions"

    传送门 题意: 给你一个无限大的整数序列  p = {1, 2, 3, ...}: 有 n 次操作,每次操作交换第 ai 个数和第 aj 个数: 求序列中逆序对的个数: 题解: 考虑交换完后的序列,存 ...