日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > asp.net >内容正文

asp.net

ASP.NET Web API 2 过滤器

發(fā)布時(shí)間:2023/12/13 asp.net 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ASP.NET Web API 2 过滤器 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?? 前言

我們知道 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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。