亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

ASP.NET Core MVC中過濾器工作原理介紹

 更新時間:2022年02月21日 11:41:42   作者:Sweet-Tang  
這篇文章介紹了ASP.NET Core MVC中過濾器的工作原理,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

過濾器的作用是在 Action 方法執(zhí)行前或執(zhí)行后做一些加工處理。使用過濾器可以避免Action方法的重復(fù)代碼,例如,您可以使用異常過濾器合并異常處理的代碼。

過濾器如何工作?

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

實(shí)現(xiàn)

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

同步過濾器定義OnStageExecuting和OnStageExecuted方法,會在管道特定階段之前和之后運(yùn)行代碼的。例如IActionFilter過濾器,在調(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
        }
    }

異步過濾器定義了一個OnStageExecutionAsync方法。該方法提供了FilterTypeExecutionDelegate的委托,當(dāng)調(diào)用該委托時會執(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
        }
    }

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

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

過濾器類型

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

  • Authorization Filter
    授權(quán)過濾器 在過濾器管道中第一個執(zhí)行,通常用于驗(yàn)證當(dāng)前請求的合法性,不合法后面的管道會直接跳過。它們只有一個Before方法,不像其它大多數(shù)過濾器支持前置階段方法和后置階段方法。注意,您不要在授權(quán)過濾器中拋出異常,因?yàn)闆]有任何代碼來處理異常(異常過濾器不處理它們)。
  • Resource Filter
    資源過濾器是第二個運(yùn)行,在 Authorization Filter 之后,Model Binding 之前執(zhí)行。在性能方面,資源過濾器在實(shí)現(xiàn)緩存或截?cái)噙^濾器管道尤為重要。
  • Action Filter
    使用率最高的過濾器,在調(diào)用 Acioin 方法之前和之后執(zhí)行代碼。跟 Resource Filter 很類似,但 Model Binding 在之后執(zhí)行。
  • Exception Filter
    用于為應(yīng)用程序執(zhí)行異常處理策略。
  • Result Filter
    當(dāng) Action 執(zhí)行完成后,最后會執(zhí)行過濾器。用于處理ActionResult結(jié)果輸出策略。

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

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

過濾器執(zhí)行順序

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

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

過濾器具有三種不同級別的作用域。您可以通過Attribute將過濾器注冊到指定控制器或 Action 方法;您也可以在Startup類的ConfigureServices方法中將過濾器注冊到MvcOptions.Filters的集合中作為全局過濾器(對所有的控制器和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>();
        }
    }

示例來自于ASP.NET Core MVC 英語文檔

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

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

序號過濾器作用域過濾器方法
1GlobalOnActionExecuting
2ControllerOnActionExecuting
3MethodOnActionExecuting
4MethodOnActionExecuted
5ControllerOnActionExecuted
6GlobalOnActionExecuted

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

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

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

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

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

序號過濾器作用域Order 屬性過濾器方法
1Method1OnActionExecuting
2Controller2OnActionExecuting
3Global3OnActionExecuting
4Global3OnActionExecuted
5Controller2OnActionExecuted
6Method1OnActionExecuted

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

到此這篇關(guān)于ASP.NET Core MVC中過濾器工作原理的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳細(xì)介紹.NET中的動態(tài)編譯技術(shù)

    詳細(xì)介紹.NET中的動態(tài)編譯技術(shù)

    這篇文章詳細(xì)介紹了.NET中的動態(tài)編譯技術(shù),有需要的朋友可以參考一下
    2013-11-11
  • IIS部署ASP.NET5的實(shí)現(xiàn)步驟

    IIS部署ASP.NET5的實(shí)現(xiàn)步驟

    本文主要介紹了ASP.NET5嘗試部署到IIS中運(yùn)行,對基礎(chǔ)入門的同學(xué)有一定的幫助,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • 如何使用Rotativa在ASP.NET Core MVC中創(chuàng)建PDF詳解

    如何使用Rotativa在ASP.NET Core MVC中創(chuàng)建PDF詳解

    這篇文章主要給大家介紹了關(guān)于如何使用Rotativa在ASP.NET Core MVC中創(chuàng)建PDF的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02
  • ASP.NET Core緩存靜態(tài)資源示例詳解

    ASP.NET Core緩存靜態(tài)資源示例詳解

    我們在優(yōu)化Web服務(wù)的時候,對于靜態(tài)的資源文件,通常都是通過客戶端緩存、服務(wù)器緩存、CDN緩存,這三種方式來緩解客戶端對于Web服務(wù)器的連接請求壓力的。下面這篇文章主要給大家介紹了關(guān)于ASP.NET Core緩存靜態(tài)資源的相關(guān)資料,需要的朋友可以參考下。
    2018-02-02
  • MVC 5 第一章 創(chuàng)建MVC 5 web應(yīng)用程序

    MVC 5 第一章 創(chuàng)建MVC 5 web應(yīng)用程序

    本章將講述一些構(gòu)建ASP.NET MVC 5 web application的一些基礎(chǔ)知識, 通過本章學(xué)習(xí),你應(yīng)該能夠掌握到構(gòu)建MVC 5應(yīng)用程序的基本步驟,并且通過展示一個完整的MVC 5 hello world應(yīng)用程序了解MVC 5應(yīng)用程序所帶來的用戶體驗(yàn)。
    2014-06-06
  • 解析asp.net的分頁控件

    解析asp.net的分頁控件

    本文主要對AspNetPager.dll這個分頁控件進(jìn)行介紹,它主要用于asp.net webform網(wǎng)站。文章結(jié)尾附上實(shí)例下載,有需要的朋友可以看下
    2016-12-12
  • .net+FusionChart實(shí)現(xiàn)動態(tài)顯示的柱狀圖和餅狀圖

    .net+FusionChart實(shí)現(xiàn)動態(tài)顯示的柱狀圖和餅狀圖

    這篇文章介紹了.net+FusionChart實(shí)現(xiàn)動態(tài)顯示柱狀圖和餅狀圖的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • Javascript調(diào)用Webservice的多種方法

    Javascript調(diào)用Webservice的多種方法

    通過xmlhttp+webservice(原始方法)
    2009-02-02
  • ASP.NET Core MVC學(xué)習(xí)之視圖組件(View Component)

    ASP.NET Core MVC學(xué)習(xí)之視圖組件(View Component)

    這篇文章主要給大家介紹了關(guān)于ASP.NET Core MVC學(xué)習(xí)之視圖組件(View Component)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用ASP.NET Core MVC具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • 一步步打造簡單的MVC電商網(wǎng)站BooksStore(2)

    一步步打造簡單的MVC電商網(wǎng)站BooksStore(2)

    這篇文章主要和大家一起一步步打造一個簡單的MVC電商網(wǎng)站,MVC電商網(wǎng)站BooksStore第二篇,添加分類導(dǎo)航、加入購物車,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-04-04

最新評論