真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Asp.NetWebAPI中Filter的使用以及執(zhí)行順序(收藏)

小編給大家分享一下Asp.Net WebAPI中 Filter的使用以及執(zhí)行順序(收藏),相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

創(chuàng)新互聯(lián)建站主要從事網(wǎng)頁設(shè)計(jì)、PC網(wǎng)站建設(shè)(電腦版網(wǎng)站建設(shè))、wap網(wǎng)站建設(shè)(手機(jī)版網(wǎng)站建設(shè))、響應(yīng)式網(wǎng)站建設(shè)、程序開發(fā)、網(wǎng)站優(yōu)化、微網(wǎng)站、小程序開發(fā)等,憑借多年來在互聯(lián)網(wǎng)的打拼,我們在互聯(lián)網(wǎng)網(wǎng)站建設(shè)行業(yè)積累了豐富的成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)、網(wǎng)站設(shè)計(jì)、網(wǎng)絡(luò)營銷經(jīng)驗(yàn),集策劃、開發(fā)、設(shè)計(jì)、營銷、管理等多方位專業(yè)化運(yùn)作于一體。

在WEB Api中,引入了面向切面編程(AOP)的思想,在某些特定的位置可以插入特定的Filter進(jìn)行過程攔截處理。引入了這一機(jī)制可以更好地踐行DRY(Don’t Repeat Yourself)思想,通過Filter能統(tǒng)一地對(duì)一些通用邏輯進(jìn)行處理,如:權(quán)限校驗(yàn)、參數(shù)加解密、參數(shù)校驗(yàn)等方面我們都可以利用這一特性進(jìn)行統(tǒng)一處理,今天我們來介紹Filter的開發(fā)、使用以及討論他們的執(zhí)行順序。

一、Filter的開發(fā)和調(diào)用

在默認(rèn)的WebApi中,框架提供了三種Filter,他們的功能和運(yùn)行條件如下表所示:

Filter類型

實(shí)現(xiàn)的接口

描述

Authorization

IAuthorizationFilter

最先運(yùn)行的Filter,被用作請(qǐng)求權(quán)限校驗(yàn)

Action

IActionFilter

在Action運(yùn)行的前、后運(yùn)行

Exception

IExceptionFilter

當(dāng)異常發(fā)生的時(shí)候運(yùn)行

首先,我們實(shí)現(xiàn)一個(gè)AuthorizatoinFilter可以用以簡單的權(quán)限控制:

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

             (!= HttpError(

一個(gè)簡單的用于用戶驗(yàn)證的Filter就開發(fā)完了,這個(gè)Filter要求用戶的請(qǐng)求中帶有Authorization頭并且參數(shù)為123456,如果通過則放行,不通過則返回401錯(cuò)誤,并在Content中提示Token不正確。下面,我們需要注冊這個(gè)Filter,注冊Filter有三種方法:

第一種:在我們希望進(jìn)行權(quán)限控制的Action上打上AuthFilterAttribute這個(gè)Attribute:

    public class PersonController : ApiController
    {
        [AuthFilter]        public CreateResult Post(CreateUser user)
        {            return new CreateResult() {Id = "123"};
        }
    }

這種方式適合單個(gè)Action的權(quán)限控制。

第二種,找到相應(yīng)的Controller,并打上這個(gè)Attribute:

    [AuthFilter]    public class PersonController : ApiController
    {        public CreateResult Post(CreateUser user)
        {            return new CreateResult() {Id = "123"};
        }
    }

這種方式適合于控制整個(gè)Controller,打上這個(gè)Attribute以后,整個(gè)Controller里所有Action都獲得了權(quán)限控制。

第三種,找到App_Start\WebApiConfig.cs,在Register方法下加入Filter實(shí)例:

   { id =

用這種方式適合于控制所有的API,任意Controller和任意Action都接受了這個(gè)權(quán)限控制。

在大多數(shù)場景中,每個(gè)API的權(quán)限驗(yàn)證邏輯都是一樣的,在這樣的前提下使用全局注冊Filter的方法最為簡單便捷,可這樣存在一個(gè)顯而易見的問題:如果某幾個(gè)API是不需要控制的(例如登錄)怎么辦?我們可以在這樣的API上做這樣的處理:

[AllowAnonymous]public CreateResult PostLogin(LoginEntity entity)
{      //TODO:添加驗(yàn)證邏輯
      return new CreateResult() {Id = "123456"};
}

我為這個(gè)Action打上了AllowAnonymousAttribute,驗(yàn)證邏輯就放過了這個(gè)API而不進(jìn)行權(quán)限校驗(yàn)。

在實(shí)際的開發(fā)中,我們可以設(shè)計(jì)一套類似Session的機(jī)制,通過用戶登錄來獲取Token,在之后的交互HTTP請(qǐng)求中加上Authorization頭并帶上這個(gè)Token,并在自定義的AuthFilterAttribute中對(duì)Token進(jìn)行驗(yàn)證,一套標(biāo)準(zhǔn)的Token驗(yàn)證流程就可以實(shí)現(xiàn)了。

接下來我們介紹ActionFilter:

ActionFilterAttrubute提供了兩個(gè)方法進(jìn)行攔截:OnActionExecuting和OnActionExecuted,他們都提供了同步和異步的方法。

OnActionExecuting方法在Action執(zhí)行之前執(zhí)行,OnActionExecuted方法在Action執(zhí)行完成之后執(zhí)行。

我們來看一個(gè)應(yīng)用場景:使用過MVC的同學(xué)一定不陌生MVC的模型綁定和模型校驗(yàn),使用起來非常方便,定義好Entity之后,在需要進(jìn)行校驗(yàn)的地方可以打上相應(yīng)的Attribute,在Action開始時(shí)檢查ModelState的IsValid屬性,如果校驗(yàn)不通過直接返回View,前端可以解析并顯示未通過校驗(yàn)的原因。而Web API中也繼承了這一方便的特性,使用起來更加方便:

 public class CustomActionFilterAttribute : ActionFilterAttribute
{    public override void OnActionExecuting(HttpActionContext actionContext)
    {        if (!actionContext.ModelState.IsValid)
        {
            actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.BadRequest,  actionContext.ModelState);
        }
    }
}

這個(gè)Filter就提供了模型校驗(yàn)的功能,如果未通過模型校驗(yàn)則返回400錯(cuò)誤,并把相關(guān)的錯(cuò)誤信息交給調(diào)用者。他的使用方法和AuthFilterAttribute一樣,可以針對(duì)Action、Controller、全局使用。我們可以用下面一個(gè)例子來驗(yàn)證:

代碼如下:

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

    [Required(ErrorMessage = "缺少密碼")]    public string Password { get; set; }
}
[AllowAnonymous]
[CustomActionFilter]public CreateResult PostLogin(LoginEntity entity)
{     //TODO:添加驗(yàn)證邏輯
     return new CreateResult() {Id = "123456"};
}

Asp.Net WebAPI中 Filter的使用以及執(zhí)行順序(收藏)

當(dāng)然,你也可以根據(jù)自己的需要解析ModelState然后用自己的格式將錯(cuò)誤信息通過Request.CreateResponse()返回給用戶。

OnActionExecuted方法我在實(shí)際工作中使用得較少,目前僅在一次部分響應(yīng)數(shù)據(jù)加密的場景下進(jìn)行過使用,使用方法一樣,讀取已有的響應(yīng),并加密后再給出加密后的響應(yīng)賦值給actionContext.Response即可。

我給大家一個(gè)Demo:

public override async Task OnActionExecutedAsync(HttpActionExecutedContext actionExecutedContext, CancellationToken cancellationToken)
{        var key = 10;        var responseBody = await actionExecutedContext.Response.Content.ReadAsByteArrayAsync(); //以Byte數(shù)組方式讀取Content中的數(shù)據(jù)

        for (int i = 0; i < responseBody.Length; i++)
        {
            responseBody[i] = (byte)(responseBody[i] ^ key); //對(duì)每一個(gè)Byte做異或運(yùn)算        }

        actionExecutedContext.Response.Content = new ByteArrayContent(responseBody); //將結(jié)果賦值給Response的Content
        actionExecutedContext.Response.Content.Headers.ContentType = MediaTypeHeaderValue.Parse("Encrypt/Bytes"); //并修改Content-Type}

Asp.Net WebAPI中 Filter的使用以及執(zhí)行順序(收藏)

通過這個(gè)方法我們將響應(yīng)的Content每個(gè)Byte都做了一個(gè)異或運(yùn)算,對(duì)響應(yīng)內(nèi)容進(jìn)行了一次簡單的加密,大家可以根據(jù)自己的需要進(jìn)行更可靠的加密,如AES、DES或者RSA…通過這個(gè)方法可以靈活地對(duì)某個(gè)Action的處理后的結(jié)果進(jìn)行處理,通過Filter進(jìn)行響應(yīng)內(nèi)容加密有很強(qiáng)的靈活性和通用性,他能獲取當(dāng)前Action的很多信息,然后根據(jù)這些信息選擇加密的方式、獲取加密所需的參數(shù)等等。如果加密所使用參數(shù)對(duì)當(dāng)前執(zhí)行的Action沒有依賴,也可以采取HttpMessageHandler來進(jìn)行處理,在之后的教程中我會(huì)進(jìn)行介紹。

最后一個(gè)Filter:ExceptionFilter

顧名思義,這個(gè)Filter是用來進(jìn)行異常處理的,當(dāng)業(yè)務(wù)發(fā)生未處理的異常,我們是不希望用戶接收到黃頁或者其他用戶無法解析的信息的,我們可以使用ExceptionFilter來進(jìn)行統(tǒng)一處理:

public class ExceptionFilter : ExceptionFilterAttribute
{    public override void OnException(HttpActionExecutedContext actionExecutedContext)
    {        //如果截獲異常為我們自定義,可以處理的異常則通過我們自己的規(guī)則處理
        if (actionExecutedContext.Exception is DemoException)
        {            //TODO:記錄日志
            actionExecutedContext.Response = actionExecutedContext.Request.CreateResponse(
                    HttpStatusCode.BadRequest, new {Message = actionExecutedContext.Exception.Message});
        }        else
        {            //如果截獲異常是我沒無法預(yù)料的異常,則將通用的返回信息返回給用戶,避免泄露過多信息,也便于用戶處理            //TODO:記錄日志
            actionExecutedContext.Response =
                    actionExecutedContext.Request.CreateResponse(HttpStatusCode.InternalServerError,                        new {Message = "

我們定義了一個(gè)ExceptoinFilter用于處理未捕獲的異常,我們將異常分為兩類:一類是我們可以預(yù)料的異常:如業(yè)務(wù)參數(shù)錯(cuò)誤,越權(quán)等業(yè)務(wù)異常;還有一類是我們無法預(yù)料的異常:如數(shù)據(jù)庫連接斷開、內(nèi)存溢出等異常。我們通過HTTP Code告知調(diào)用者以及用相對(duì)固定、友好的數(shù)據(jù)結(jié)構(gòu)將異常信息告訴調(diào)用者,以便于調(diào)用者記錄并處理這樣的異常。

 [CustomerExceptionFilter]public class TestController : ApiController
{    public int Get(int a, int b)
    {        if (a < b)
        {            throw new DemoException("A必須要比B大!");
        }        if (a == b)
        {            throw new NotImplementedException();
        }        return a*b;
    }
}

我們定義了一個(gè)Action:在不同的情況下會(huì)拋出不同的異常,其中一個(gè)異常是我們能夠預(yù)料并認(rèn)為是調(diào)用者傳參出錯(cuò)的,一個(gè)是不能夠處理的,我們看一下結(jié)果:

Asp.Net WebAPI中 Filter的使用以及執(zhí)行順序(收藏)

Asp.Net WebAPI中 Filter的使用以及執(zhí)行順序(收藏)

在這樣的RestApi中,我們可以預(yù)先定義好異常的表現(xiàn)形式,讓調(diào)用者可以方便地判斷什么情況下是出現(xiàn)異常了,然后通過較為統(tǒng)一的異常信息返回方式讓調(diào)用者方便地解析異常信息,形成統(tǒng)一方便的異常消息處理機(jī)制。

   但是,ExceptionFilter只能在成功完成了Controller的初始化以后才能起到捕獲、處理異常的作用,而在Controller初始化完成之前(例如在Controller的構(gòu)造函數(shù)中出現(xiàn)了異常)則ExceptionFilter無能為力。對(duì)此WebApi引入了ExceptionLogger和ExceptionHandler處理機(jī)制,我們將在之后的文章中進(jìn)行講解。

二、Filter的執(zhí)行順序

在使用MVC的時(shí)候,ActionFilter提供了一個(gè)Order屬性,用戶可以根據(jù)這個(gè)屬性控制Filter的調(diào)用順序,而Web API卻不再支持該屬性。Web API的Filter有自己的一套調(diào)用順序規(guī)則:

所有Filter根據(jù)注冊位置的不同擁有三種作用域:Global、Controller、Action:

通過HttpConfiguration類實(shí)例下Filters.Add()方法注冊的Filter(一般在App_Start\WebApiConfig.cs文件中的Register方法中設(shè)置)就屬于Global作用域;

通過Controller上打的Attribute進(jìn)行注冊的Filter就屬于Controller作用域;

通過Action上打的Attribute進(jìn)行注冊的Filter就屬于Action作用域;

他們遵循了以下規(guī)則:

1、在同一作用域下,AuthorizationFilter最先執(zhí)行,之后執(zhí)行ActionFilter

2、對(duì)于AuthorizationFilter和ActionFilter.OnActionExcuting來說,如果一個(gè)請(qǐng)求的生命周期中有多個(gè)Filter的話,執(zhí)行順序都是Global->Controller->Action;

3、對(duì)于ActionFilter,OnActionExecuting總是先于OnActionExecuted執(zhí)行;

4、對(duì)于ExceptionFilter和ActionFilter.OnActionExcuted而言執(zhí)行順序?yàn)锳ction->Controller->Global;

5、對(duì)于所有Filter來說,如果阻止了請(qǐng)求:即對(duì)Response進(jìn)行了賦值,則后續(xù)的Filter不再執(zhí)行。

關(guān)于默認(rèn)情況下的Filter相關(guān)知識(shí)我們就講這么一些,如果在文章中有任何不正確的地方或者疑問,歡迎大家為我指出。

以上是Asp.Net WebAPI中 Filter的使用以及執(zhí)行順序(收藏)的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!


本文標(biāo)題:Asp.NetWebAPI中Filter的使用以及執(zhí)行順序(收藏)
轉(zhuǎn)載來于:
http://weahome.cn/article/ijcjsi.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部