Ø 前言

我们知道 ASP.NET Web API 过滤器,也是属于消息处理机制中的一部分。正因如此,我们经常使用它来完成对请求的授权验证、参数验证,以及请求的 Log 记录,程序异常捕获等。

1. 常用的四大过滤器

Ø ASP.NET Web API 2 中的所有过滤器位于 System.Web.Http.dll 中的 System.Web.Http.Filters 命名空间中,继承关系如下:

clip_image001[1]

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 命名空间,这不能搞混了!

Ø 首先,我们来看下过滤器的执行顺序

clip_image003[1]

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 () ,在调用 A ction() 方法之前执行,另一个是 OnActionExecuted() ,在调用 A ct ion() 方法之后执行。

/// <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 过滤器的。