Asp.Net WebAPI中 Filter的使用以及执行顺序(收藏)


本文摘自PHP中文网,作者PHPzhong,侵删。

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

一、Filter的开发和调用

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

Filter 类型

实现的接口

描述

Authorization

IAuthorizationFilter

最先运行的Filter,被用作请求权限校验

Action

IActionFilter

在Action运行的前、后运行

Exception

IExceptionFilter

当异常发生的时候运行

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

1

2

3

(actionContext.ActionDescriptor.GetCustomAttributes<AllowAnonymousAttribute> verifyResult = actionContext.Request.Headers.Authorization!= &&  == ;

 

(!= HttpError(

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

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

1

2

3

4

5

6

public class PersonController : ApiController

{

    [AuthFilter]        public CreateResult Post(CreateUser user)

    {            return new CreateResult() {Id = "123"};

    }

}

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

第二种,找到相应的Controller,并打上这个Attribute:

1

2

3

4

5

[AuthFilter]    public class PersonController : ApiController

{        public CreateResult Post(CreateUser user)

    {            return new CreateResult() {Id = "123"};

    }

}

这种方式适合于控制整个Controller,打上这个Attribute以后,整个Controller里所有Action都获得了权限控制。

第三种,找到App_Start\WebApiConfig.cs,在Register方法下加入Filter实例:

1

{ id =

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

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

1

2

3

4

[AllowAnonymous]public CreateResult PostLogin(LoginEntity entity)

{      //TODO:添加验证逻辑

      return new CreateResult() {Id = "123456"};

}

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

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

接下来我们介绍ActionFilter:

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

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

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

1

2

3

4

5

6

7

8

public class CustomActionFilterAttribute : ActionFilterAttribute

{    public override void OnActionExecuting(HttpActionContext actionContext)

    {        if (!actionContext.ModelState.IsValid)

        {

            actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.BadRequest,  actionContext.ModelState);

        }

    }

}

这个Filter就提供了模型校验的功能,如果未通过模型校验则返回400错误,并把相关的错误信息交给调用者。他的使用方法和AuthFilterAttribute一样,可以针对Action、Controller、全局使用。我们可以用下面一个例子来验证:

代码如下:

1

2

3

4

5

6

public class LoginEntity

{

    [Required(ErrorMessage = "缺少用户名")]    public string UserName { get; set; }

 

    [Required(ErrorMessage = "缺少密码")]    public string Password { get; set; }

}


1

2

3

4

5

[AllowAnonymous]

[CustomActionFilter]public CreateResult PostLogin(LoginEntity entity)

{     //TODO:添加验证逻辑

     return new CreateResult() {Id = "123456"};

}

阅读剩余部分

相关阅读 >>

分享asp.net学习笔记(11)webpages php

分享asp.net core在开发环境中保存机密(user secrets)的实例

解决win7安装visual studio 2015失败的方法

详解.net完成configuration读取配置的实例详解

asp.net简单的格式转换方法

分享asp.net学习笔记(13)razor 语法详解

asp.net一些经典的问题详解

asp.net是什么

asp.net与asp有什么不同

asp.net core项目结构教程(4)_实用技巧

更多相关阅读请进入《asp.net》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...