溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

ASP.NET?Core?MVC中怎么實(shí)現(xiàn)過(guò)濾器

發(fā)布時(shí)間:2022-02-21 14:48:44 來(lái)源:億速云 閱讀:162 作者:iii 欄目:開(kāi)發(fā)技術(shù)

本篇內(nèi)容介紹了“ASP.NET Core MVC中怎么實(shí)現(xiàn)過(guò)濾器”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

過(guò)濾器如何工作?

過(guò)濾器在 MVC Action 調(diào)用管道中運(yùn)行,有時(shí)稱為過(guò)濾器管道。MVC選擇要執(zhí)行的Action方法后,才會(huì)執(zhí)行過(guò)濾器管道:

ASP.NET?Core?MVC中怎么實(shí)現(xiàn)過(guò)濾器

實(shí)現(xiàn)

過(guò)濾器同時(shí)支持同步和異步兩種不同的接口定義。您可以根據(jù)執(zhí)行的任務(wù)類型,選擇同步或異步實(shí)現(xiàn)。

同步過(guò)濾器定義OnStageExecuting和OnStageExecuted方法,會(huì)在管道特定階段之前和之后運(yùn)行代碼的。例如IActionFilter過(guò)濾器,在調(diào)用Action方法之前調(diào)用OnActionExecuting,在Action方法之回之后調(diào)用OnActionExecuted

    public class SampleActionFilter : IActionFilter
    {
        public void OnActionExecuting(ActionExecutingContext context)
        {
            // do something before the action executes
        }

        public void OnActionExecuted(ActionExecutedContext context)
        {
            // do something after the action executes
        }
    }

異步過(guò)濾器定義了一個(gè)OnStageExecutionAsync方法。該方法提供了FilterTypeExecutionDelegate的委托,當(dāng)調(diào)用該委托時(shí)會(huì)執(zhí)行具體管道階段的工作。例如,ActionExecutionDelegate用于調(diào)用Action方法,您可以在調(diào)用它之前和之后執(zhí)行代碼。

    public class SampleAsyncActionFilter : IAsyncActionFilter
    {
        public async Task OnActionExecutionAsync(
            ActionExecutingContext context,
            ActionExecutionDelegate next)
        {
            // do something before the action executes
            await next();
            // do something after the action executes
        }
    }

您可以在單個(gè)類中實(shí)現(xiàn)多個(gè)過(guò)濾器接口。例如,ActionFilterAttribute抽象類實(shí)現(xiàn)了IActionFilterIResultFilter,以及與它們對(duì)應(yīng)的異步接口。

提示您不需要同時(shí)實(shí)現(xiàn)兩種過(guò)濾器接口,要么是同步的,要么是異步的??蚣苁紫葯z查過(guò)濾器是否實(shí)現(xiàn)了異步接口,如果是,直接執(zhí)行異步方法。如果不是,它會(huì)執(zhí)行同步接口的方法。如果在一個(gè)類上同時(shí)實(shí)現(xiàn)兩種接口,則只會(huì)調(diào)用異步方法。當(dāng)使用像ActionFilterAttribute這類抽象類時(shí),您只需要覆蓋過(guò)濾器的同步方法或異步方法。

過(guò)濾器類型

ASP.NET Core 有以下五種類型的過(guò)濾器,每個(gè)過(guò)濾器類型在過(guò)濾器管道中的不同階段執(zhí)行:

  • Authorization Filter
    授權(quán)過(guò)濾器 在過(guò)濾器管道中第一個(gè)執(zhí)行,通常用于驗(yàn)證當(dāng)前請(qǐng)求的合法性,不合法后面的管道會(huì)直接跳過(guò)。它們只有一個(gè)Before方法,不像其它大多數(shù)過(guò)濾器支持前置階段方法和后置階段方法。注意,您不要在授權(quán)過(guò)濾器中拋出異常,因?yàn)闆](méi)有任何代碼來(lái)處理異常(異常過(guò)濾器不處理它們)。

  • Resource Filter
    資源過(guò)濾器是第二個(gè)運(yùn)行,在 Authorization Filter 之后,Model Binding 之前執(zhí)行。在性能方面,資源過(guò)濾器在實(shí)現(xiàn)緩存或截?cái)噙^(guò)濾器管道尤為重要。

  • Action Filter
    使用率最高的過(guò)濾器,在調(diào)用 Acioin 方法之前和之后執(zhí)行代碼。跟 Resource Filter 很類似,但 Model Binding 在之后執(zhí)行。

  • Exception Filter
    用于為應(yīng)用程序執(zhí)行異常處理策略。

  • Result Filter
    當(dāng) Action 執(zhí)行完成后,最后會(huì)執(zhí)行過(guò)濾器。用于處理ActionResult結(jié)果輸出策略。

過(guò)濾器運(yùn)行順序

ASP.NET Core 的每個(gè)請(qǐng)求都會(huì)先經(jīng)過(guò)已注冊(cè)的`Middleware`,接著才會(huì)執(zhí)行過(guò)濾器:同類型的過(guò)濾器都會(huì)以先進(jìn)后出的方式執(zhí)行。

ASP.NET?Core?MVC中怎么實(shí)現(xiàn)過(guò)濾器

黃色箭頭是正常情況流程
灰色箭頭是異常處理流程

過(guò)濾器的作用域與執(zhí)行順序

過(guò)濾器具有三種不同級(jí)別的作用域。您可以通過(guò)Attribute將過(guò)濾器注冊(cè)到指定控制器或 Action 方法;您也可以在Startup類的ConfigureServices方法中將過(guò)濾器注冊(cè)到MvcOptions.Filters的集合中作為全局過(guò)濾器(對(duì)所有的控制器和Action方法均有效):

    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc(options =>
            {
                options.Filters.Add(new AddHeaderAttribute("GlobalAddHeader", 
                    "Result filter added to MvcOptions.Filters")); // an instance
                options.Filters.Add(typeof(SampleActionFilter)); // by type
                options.Filters.Add(new SampleGlobalActionFilter()); // an instance
            });

            services.AddScoped<AddHeaderFilterWithDi>();
        }
    }

示例來(lái)自于ASP.NET Core MVC 英語(yǔ)文檔

默認(rèn)執(zhí)行順序

當(dāng)管道的某個(gè)階段存在多個(gè)過(guò)濾器時(shí),過(guò)濾器執(zhí)行的默認(rèn)順序由作用域確定:全局過(guò)濾器優(yōu)先于控制器過(guò)濾器,控制器過(guò)濾器優(yōu)先于Action方法過(guò)濾器。
以下示例是同步 Action 過(guò)濾器調(diào)用的順序:

序號(hào)過(guò)濾器作用域過(guò)濾器方法
1GlobalOnActionExecuting
2ControllerOnActionExecuting
3MethodOnActionExecuting
4MethodOnActionExecuted
5ControllerOnActionExecuted
6GlobalOnActionExecuted

提示每個(gè)控制器的基類Controller包含OnActionExecutingOnActionExecuted方法。其中OnActionExecuting在所有過(guò)濾器之前調(diào)用,OnActionExecuted在所有過(guò)濾器之后調(diào)用。

覆蓋默認(rèn)執(zhí)行順序

您可以通過(guò)實(shí)現(xiàn)IOrderedFilter接口來(lái)覆蓋默認(rèn)的執(zhí)行順序。此接口公開(kāi)了Order屬性表示優(yōu)先級(jí),以確定執(zhí)行順序;具有較低Order值的過(guò)濾器將在具有較高Order值的過(guò)濾器之前執(zhí)行前置方法;具有較低Order值的過(guò)濾器將在具有較高Order值的過(guò)濾器之后執(zhí)行后置方法。
您可以使用構(gòu)造函數(shù)參數(shù)設(shè)置Order屬性:

[MyFilter(Name = "Controller Level Attribute", Order=1)]

如果您將上述示例中 Action 過(guò)濾器的Order設(shè)置為1,將控制器和全局過(guò)濾器的Order屬性分別設(shè)置為2和3,則執(zhí)行順序?qū)⑴c默認(rèn)相反。

序號(hào)過(guò)濾器作用域Order 屬性過(guò)濾器方法
1Method1OnActionExecuting
2Controller2OnActionExecuting
3Global3OnActionExecuting
4Global3OnActionExecuted
5Controller2OnActionExecuted
6Method1OnActionExecuted

過(guò)濾器執(zhí)行時(shí),Order屬性的優(yōu)先級(jí)高于作用域。過(guò)濾器首先按Order屬性排序,然后再按作用域排序。所有內(nèi)置過(guò)濾器實(shí)現(xiàn)IOrderedFilter接口并將Order值默認(rèn)設(shè)置為0;因此,除非設(shè)置Order屬性為非零值,否則按作用域的優(yōu)先級(jí)執(zhí)行。

“ASP.NET Core MVC中怎么實(shí)現(xiàn)過(guò)濾器”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI