當前位置:
首頁 > 知識 > ASP.NET Core MVC 過濾器介紹

ASP.NET Core MVC 過濾器介紹

過濾器的作用是在 Action 方法執行前或執行後做一些加工處理。使用過濾器可以避免Action方法的重複代碼,例如,您可以使用異常過濾器合并異常處理的代碼。

過濾器如何工作?

過濾器在 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 有以下五種類型的過濾器,每個過濾器類型在過濾器管道中的不同階段執行:

  1. Authorization Filter
    授權過濾器在過濾器管道中第一個執行,通常用於驗證當前請求的合法性,不合法後面的管道會直接跳過。它們只有一個Before方法,不像其它大多數過濾器支持前置階段方法和後置階段方法。

    注意

    ,您不要在授權過濾器中拋出異常,因為沒有任何代碼來處理異常(異常過濾器不處理它們)。
  2. Resource Filter
    資源過濾器是第二個運行,在 Authorization Filter 之後,Model Binding 之前執行。在性能方面,資源過濾器在實現緩存或截斷過濾器管道尤為重要。
  3. Action Filter
    使用率最高的過濾器,在調用 Acioin 方法之前和之後執行代碼。跟 Resource Filter 很類似,但 Model Binding 在之後執行。
  4. Exception Filter
    用於為應用程序執行異常處理策略。
  5. Result Filter
    當 Action 執行完成後,最後會執行過濾器。用於處理ActionResult結果輸出策略。

過濾器運行順序

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

ASP.NET Core MVC 過濾器介紹

圖片來自 John Wu的博客


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

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

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

默認執行順序

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


序號 過濾器作用域 過濾器方法
1 Global OnActionExecuting
2 Controller OnActionExecuting
3 Method OnActionExecuting
4 Method OnActionExecuted
5 Controller OnActionExecuted
6 Global OnActionExecuted


提示

每個控制器的基類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屬性 過濾器方法
1 Method 1 OnActionExecuting
2 Controller 2 OnActionExecuting
3 Global 3 OnActionExecuting
4 Global 3 OnActionExecuted
5 Controller 2 OnActionExecuted
6 Method 1 OnActionExecuted

過濾器執行時,Order屬性的優先順序高於作用域。過濾器首先按Order屬性排序,然後再按作用域排序。所有內置過濾器實現IOrderedFilter介面並將Order值默認設置為0;因此,除非設置Order屬性為非零值,否則按作用域的優先順序執行。

總結

今天我們已經了解了關於過濾器基本知識,在下一篇博客中,我們將介紹內置過濾器、過濾的使用、依賴注入、取消與截斷等知識,謝謝!

參考資料

  • https://blog.johnwu.cc/article/asp-net-core-filters.html
  • https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/filters

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 科技優家 的精彩文章:

Redis 錯誤1067:進程意外終止,Redis不能啟動,Redis啟動不了
Windows Redis默認配置文件,Redis配置不生效解決方案
用 volume container 共享數據
Python爬蟲從入門到放棄(十五)之 Scrapy框架中Spiders用法
標準IO:文件的打開與關閉函數 fopen() & fclose

TAG:科技優家 |

您可能感興趣

Docky變色器、廣告過濾器等12款APP限免#ios
Servlet 編寫過濾器
Filter過濾器和Listener監聽器的的用法和區別
SpringBoot | 第七章:過濾器、監聽器、攔截器
Ayawawa、咪蒙和三觀過濾器
人工新聞過濾器Vol.01
33.製作你自己的線性過濾器!-OpenCV從零開始到圖像
Zortrax為其3D印表機推出新型附加空氣過濾器
歐盟19成員國支持新版權法,Facebook等社交平台須安裝過濾器
Wireshark捕獲過濾器在處理網上問題時的應用
Smartmi智米推出智能馬桶蓋過濾器:售價99元
FloSmart能通知用戶及時更換空氣過濾器
歐盟19國支持新版權法改革,Facebook 等分享平台將必須安裝過濾器
ayawawa:衛生不達標的三觀過濾器
布隆過濾器、SPV和比特幣
谷歌Gmail郵件過濾器疑似出現故障
老外把iPhoneX打碎做成飲料 用過濾器過濾後喝一口吐了
看我如何繞過某託管公司域上的強大XSS過濾器
美F-22為何要加裝碳過濾器? 大批飛行員上訴F-22是飛行的活棺材
美F-22為何要加裝碳過濾器?大批飛行員上訴F-22是飛行的活棺材