Ø
前言
我们知道
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
()
,在调用
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
过滤器的。