小编给大家分享一下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中过滤器的使用以及执行顺序(收藏)