Asp。净WebAPI中过滤器的使用以及执行顺序(收藏)

  介绍

小编给大家分享一下Asp。净WebAPI中过滤器的使用以及执行顺序(收藏),相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获、下面让我们一起去了解一下吧!

在WEB Api中,引入了面向切面编程(AOP)的思想,在某些特定的位置可以插入特定的过滤器进行过程拦截处理。引入了这一机制可以更好地践行干(不要重复你自己)思想,通过过滤器能统一地对一些通用逻辑进行处理,如:权限校验,参数加解密,参数校验等方面我们都可以利用这一特性进行统一处理,今天我们来介绍过滤器的开发,使用以及讨论他们的执行顺序。

在默认的WebAPI中,框架提供了三种过滤器,他们的功能和运行条件如下表所示:

<强> <强>

<强>

<强>

<强>

IAuthorizationFilter

<强>

IActionFilter

<强>异常

IExceptionFilter

首先,我们实现一个AuthorizatoinFilter可以用以简单的权限控制:

  (actionContext.ActionDescriptor.GetCustomAttributesverifyResult=actionContext.Request.Headers.Authorization !=,,==;      (?HttpError (

一个简单的用于用户验证的过滤就开发完了,这个过滤器要求用户的请求中带有授权头并且参数为123456,如果通过则放行,不通过则返回401错误,并在内容中提示牌不正确。下面,我们需要注册这个过滤器,注册过滤器有三种方法:

第一种:在我们希望进行权限控制的行动上打上AuthFilterAttribute这个属性:

公共类PersonController: ApiController   {   (AuthFilter)公共CreateResult Post (CreateUser用户)   {返回新CreateResult () {Id=?23“};   }   }

这种方式适合单个行动的权限控制。

第二种,找到相应的控制器,并打上这个属性:

(AuthFilter)公共类PersonController: ApiController   {公共CreateResult邮政(CreateUser用户)   {返回新CreateResult () {Id=?23“};   }   }

这种方式适合于控制整个控制器,打上这个属性以后,整个控制器里所有行动都获得了权限控制。

第三种,找到App_Start \ WebApiConfig。cs,在注册方法下加入过滤器实例:

{id=

用这种方式适合于控制所有的API,任意控制器和任意行动都接受了这个权限控制。

在大多数场景中,每个API的权限验证逻辑都是一样的,在这样的前提下使用全局注册过滤器的方法最为简单便捷,可这样存在一个显而易见的问题:如果某几个API是不需要控制的(例如登录)怎么办?我们可以在这样的API上做这样的处理:

(AllowAnonymous)公共CreateResult PostLogin (LoginEntity实体)   {//TODO:添加验证逻辑   返回新CreateResult () {Id=?23456“};   }

我为这个行动打上了AllowAnonymousAttribute,验证逻辑就放过了这个API而不进行权限校验。

在实际的开发中,我们可以设计一套类似会话的机制,通过用户登录来获取令牌,在之后的交互HTTP请求中加上授权头并带上这个令牌,并在自定义的AuthFilterAttribute中对令牌进行验证,一套标准的令牌验证流程就可以实现了。

接下来我们介绍ActionFilter:

ActionFilterAttrubute提供了两个方法进行拦截:OnActionExecuting和OnActionExecuted,他们都提供了同步和异步的方法。

OnActionExecuting方法在行动执行之前执行,OnActionExecuted方法在行动执行完成之后执行。

我们来看一个应用场景:使用过MVC的同学一定不陌生MVC的模型绑定和模型校验,使用起来非常方便,定义好实体之后,在需要进行校验的地方可以打上相应的属性,在行动开始时检查状态的IsValid属性,如果校验不通过直接返回看,前端可以解析并显示未通过校验的原因,而Web API中也继承了这一方便的特性,使用起来更加方便:

公共类CustomActionFilterAttribute: ActionFilterAttribute   {LoginEntity公共覆盖空白>公共类   {   (要求(ErrorMessage=叭鄙儆没?]公共字符串的用户名{得到;设置;}      (要求(ErrorMessage=叭鄙倜苈搿?]公共字符串密码{得到;设置;}   }
Asp。净WebAPI中过滤器的使用以及执行顺序(收藏)