ASP.NET Web API 2 过滤器
?? 前言
我們知道 ASP.NET Web API 過濾器,也是屬于消息處理機(jī)制中的一部分。正因如此,我們經(jīng)常使用它來完成對(duì)請(qǐng)求的授權(quán)驗(yàn)證、參數(shù)驗(yàn)證,以及請(qǐng)求的 Log 記錄,程序異常捕獲等。
?
1.?? 常用的四大過濾器
?? ASP.NET Web API 2 中的所有過濾器位于 System.Web.Http.dll 中的 System.Web.Http.Filters 命名空間中,繼承關(guān)系如下:
1.?? AuthenticationFilter:身份證驗(yàn)證過濾器,必須實(shí)現(xiàn) IAuthenticationFilter 接口。微軟推出了一套身份驗(yàn)證組件(ASP.NET Identity)就是采用了該過濾實(shí)現(xiàn),該組件位于 System.Web.Http.Owin.dll 程序集,主要使用 System.Web.Http.HostAuthenticationFilter 過濾器,可參考:https://www.cnblogs.com/yidianfeng/p/7765984.html
2.?? AuthorizationFilter:授權(quán)過濾器,必須繼承于 AuthorizationFilterAttribute 類,或?qū)崿F(xiàn) IAuthorizationFilter 接口。
3.?? ActionFilter:動(dòng)作過濾器,必須繼承于 ActionFilterAttribute 類,或者實(shí)現(xiàn) IActionFilter 接口。
4.?? ExceptionFilter:異常過濾器,必須繼承于 ExceptionFilterAttribute 類,或者實(shí)現(xiàn) IExceptionFilter 接口。
?
?? 注意:因?yàn)?span lang="en-us"> Web API 與 MVC 中很多過濾器名稱都相同,但過濾器位于的程序集和命名空間是不同的。MVC 中的過濾器位于 System.Web.Mvc.dll 中的 System.Web.Mvc 命名空間,這不能搞混了!
?
?? 首先,我們來看下過濾器的執(zhí)行順序
1)?? 圖中描述了4種過濾器的執(zhí)行順序,而每個(gè)執(zhí)行過程中發(fā)生異常,都會(huì)被異常過濾器捕獲。
2)?? 每當(dāng)一個(gè)請(qǐng)求“進(jìn)來”時(shí),可能存在的三種響應(yīng)結(jié)果:401,無訪問權(quán)限,500,請(qǐng)求發(fā)生異常,200,請(qǐng)求成功。
?
?? 過濾器的用法
1)?? 創(chuàng)建過濾器
1.?? AuthenticationFilter(身份驗(yàn)證過濾器)
它是最先執(zhí)行的過濾器,一般用于對(duì)訪問者的身份認(rèn)證等。
/// <summary>
/// 身份驗(yàn)證過濾器特性。
/// </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)
??? {
??????? //這里完成身份驗(yàn)證...
??????? 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(授權(quán)過濾器)
授權(quán)過濾器通常用于控制接口訪問權(quán)限,只有當(dāng)訪問權(quán)限滿足時(shí),才允許訪問程序中的接口。用于提高程序的安全性,防止程序被惡意篡改。通常可以使用 Basic 認(rèn)證、簽名認(rèn)證等。
/// <summary>
/// 授權(quán)過濾器特性。
/// </summary>
public class CustomAuthorizationFilterAttribute : System.Web.Http.Filters.AuthorizationFilterAttribute
{
??? /// <summary>
??? /// 在過程請(qǐng)求授權(quán)時(shí)調(diào)用。
??? /// </summary>
??? /// <param name="actionContext">操作上下文,它封裝有關(guān)使用 System.Web.Http.Filters.AuthorizationFilterAttribute 的信息。</param>
??? public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext)
??? {
??????? //這里完成請(qǐng)求權(quán)限的控制...
??? }
}
?
3.?? ActionFilter(動(dòng)作過濾器)
動(dòng)作過濾器中有兩個(gè)方法,一個(gè)是 OnActionExecuting(),在調(diào)用 Action() 方法之前執(zhí)行,另一個(gè)是 OnActionExecuted(),在調(diào)用 Action() 方法之后執(zhí)行。
/// <summary>
/// 動(dòng)作過濾器特性。
/// </summary>
public class CustomActionFilterAttribute : System.Web.Http.Filters.ActionFilterAttribute
{
??? /// <summary>
??? /// 在調(diào)用操作方法之前發(fā)生。
??? /// </summary>
??? /// <param name="actionContext">操作上下文。</param>
??? public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext)
??? {
??????? //這里完成請(qǐng)求參數(shù)的驗(yàn)證...
??? }
?
??? /// <summary>
??? /// 在調(diào)用操作方法之后發(fā)生。
??? /// </summary>
??? /// <param name="actionExecutedContext">操作執(zhí)行的上下文。</param>
??? public override void OnActionExecuted(System.Web.Http.Filters.HttpActionExecutedContext actionExecutedContext)
??? {
??????? //這里完成請(qǐng)求日志的記錄...
??? }
}
1.?? OnActionExecuting () 方法
通常可以在該方法中,完成對(duì)接口參數(shù)的效驗(yàn)。
2.?? OnActionExecuted () 方法
一般可以用于記錄調(diào)用接口的 log。
?
4.?? ExceptionFilter(異常過濾器)
異常過濾器中一個(gè) OnException() 方法,當(dāng)程序發(fā)生異常時(shí)將被執(zhí)行。通常可以用于監(jiān)控程序異常,記錄異常日志。
/// <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)
??? {
??????? //當(dāng)程序發(fā)生異常時(shí)執(zhí)行的代碼...
??????? actionExecutedContext.Response = actionExecutedContext.Request.CreateResponse(
??????????? System.Net.HttpStatusCode.InternalServerError,
??????????? string.Format("異常:【{0}】已被捕獲", actionExecutedContext.Exception.Message));
??? }
}
?
2)?? 注冊(cè)過濾器
1.?? 注冊(cè)全局過濾器
在 WebApiConfig 類的 Register() 方法中注冊(cè),例如:
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());??
通常異常過濾、動(dòng)作過濾器都是定義為全局過濾器。
?
2.?? 定義 Controller 或 Action 過濾器
我們需要為指定的 Controller 或 Action 單獨(dú)設(shè)置過濾器時(shí),也可以這樣定義:
[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 方法執(zhí)行,id值為:" + id);
}
?
?? 注意:過濾器不能在 FilterConfig 中的 RegisterGlobalFilters() 去注冊(cè),因?yàn)檫@里是注冊(cè) MVC 過濾器的。
轉(zhuǎn)載于:https://www.cnblogs.com/abeam/p/8688838.html
總結(jié)
以上是生活随笔為你收集整理的ASP.NET Web API 2 过滤器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 全国高温排行榜门槛提高到42℃ 红色预警
- 下一篇: 《Head First设计模式》批注系列