中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

ASP.NET?Core?MVC中怎么實現過濾器

發布時間:2022-02-21 14:48:44 來源:億速云 閱讀:168 作者:iii 欄目:開發技術

本篇內容介紹了“ASP.NET Core MVC中怎么實現過濾器”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

過濾器如何工作?

過濾器在 MVC Action 調用管道中運行,有時稱為過濾器管道。MVC選擇要執行的Action方法后,才會執行過濾器管道:

ASP.NET?Core?MVC中怎么實現過濾器

實現

過濾器同時支持同步和異步兩種不同的接口定義。您可以根據執行的任務類型,選擇同步或異步實現。

同步過濾器定義OnStageExecuting和OnStageExecuted方法,會在管道特定階段之前和之后運行代碼的。例如IActionFilter過濾器,在調用Action方法之前調用OnActionExecuting,在Action方法之回之后調用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的委托,當調用該委托時會執行具體管道階段的工作。例如,ActionExecutionDelegate用于調用Action方法,您可以在調用它之前和之后執行代碼。

    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
        }
    }

您可以在單個類中實現多個過濾器接口。例如,ActionFilterAttribute抽象類實現了IActionFilterIResultFilter,以及與它們對應的異步接口。

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

過濾器類型

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

  • Authorization Filter
    授權過濾器 在過濾器管道中第一個執行,通常用于驗證當前請求的合法性,不合法后面的管道會直接跳過。它們只有一個Before方法,不像其它大多數過濾器支持前置階段方法和后置階段方法。注意,您不要在授權過濾器中拋出異常,因為沒有任何代碼來處理異常(異常過濾器不處理它們)。

  • Resource Filter
    資源過濾器是第二個運行,在 Authorization Filter 之后,Model Binding 之前執行。在性能方面,資源過濾器在實現緩存或截斷過濾器管道尤為重要。

  • Action Filter
    使用率最高的過濾器,在調用 Acioin 方法之前和之后執行代碼。跟 Resource Filter 很類似,但 Model Binding 在之后執行。

  • Exception Filter
    用于為應用程序執行異常處理策略。

  • Result Filter
    當 Action 執行完成后,最后會執行過濾器。用于處理ActionResult結果輸出策略。

過濾器運行順序

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

ASP.NET?Core?MVC中怎么實現過濾器

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

過濾器的作用域與執行順序

過濾器具有三種不同級別的作用域。您可以通過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 英語文檔

默認執行順序

當管道的某個階段存在多個過濾器時,過濾器執行的默認順序由作用域確定:全局過濾器優先于控制器過濾器,控制器過濾器優先于Action方法過濾器。
以下示例是同步 Action 過濾器調用的順序:

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

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

覆蓋默認執行順序

您可以通過實現IOrderedFilter接口來覆蓋默認的執行順序。此接口公開了Order屬性表示優先級,以確定執行順序;具有較低Order值的過濾器將在具有較高Order值的過濾器之前執行前置方法;具有較低Order值的過濾器將在具有較高Order值的過濾器之后執行后置方法。
您可以使用構造函數參數設置Order屬性:

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

如果您將上述示例中 Action 過濾器的Order設置為1,將控制器和全局過濾器的Order屬性分別設置為2和3,則執行順序將與默認相反。

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

過濾器執行時,Order屬性的優先級高于作用域。過濾器首先按Order屬性排序,然后再按作用域排序。所有內置過濾器實現IOrderedFilter接口并將Order值默認設置為0;因此,除非設置Order屬性為非零值,否則按作用域的優先級執行。

“ASP.NET Core MVC中怎么實現過濾器”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

育儿| 东平县| 岢岚县| 吉木萨尔县| 建水县| 马公市| 江达县| 张北县| 江北区| 兴山县| 兰坪| 莆田市| 叙永县| 永春县| 咸丰县| 抚远县| 崇州市| 澄江县| 措美县| 临潭县| 中宁县| 巍山| 广西| 贡嘎县| 昭苏县| 高淳县| 宣汉县| 称多县| 玛多县| 恩施市| 镇江市| 商城县| 西平县| 邻水| 社旗县| 新兴县| 彰化县| 通化市| 获嘉县| 陵川县| 乾安县|