<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
過濾器的作用是在 Action 方法執行前或執行後做一些加工處理。使用過濾器可以避免Action方法的重複程式碼,例如,您可以使用異常過濾器合併例外處理的程式碼。
過濾器在 MVC Action 呼叫管道中執行,有時稱為過濾器管道。MVC選擇要執行的Action方法後,才會執行過濾器管道:
過濾器同時支援同步和非同步兩種不同的介面定義。您可以根據執行的任務型別,選擇同步或非同步實現。
同步過濾器定義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抽象類實現了IActionFilter
和IResultFilter
,以及與它們對應的非同步介面。
提示您不需要同時實現兩種過濾器介面,要麼是同步的,要麼是非同步的。框架首先檢查過濾器是否實現了非同步介面,如果是,直接執行非同步方法。如果不是,它會執行同步介面的方法。如果在一個類上同時實現兩種介面,則只會呼叫非同步方法。當使用像
ActionFilterAttribute
這類抽象類時,您只需要覆蓋過濾器的同步方法或非同步方法。
ASP.NET Core 有以下五種型別的過濾器,每個過濾器型別在過濾器管道中的不同階段執行:
Before
方法,不像其它大多數過濾器支援前置階段方法和後置階段方法。注意,您不要在授權過濾器中丟擲異常,因為沒有任何程式碼來處理異常(異常過濾器不處理它們)。ASP.NET Core 的每個請求都會先經過已註冊的`Middleware`,接著才會執行過濾器:同型別的過濾器都會以先進後出的方式執行。
黃色箭頭是正常情況流程
灰色箭頭是例外處理流程
過濾器具有三種不同級別的作用域。您可以通過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>(); } }
當管道的某個階段存在多個過濾器時,過濾器執行的預設順序由作用域確定:全域性過濾器優先於控制器過濾器,控制器過濾器優先於Action方法過濾器。
以下範例是同步 Action 過濾器呼叫的順序:
序號 | 過濾器作用域 | 過濾器方法 |
---|---|---|
1 | Global | OnActionExecuting |
2 | Controller | OnActionExecuting |
3 | Method | OnActionExecuting |
4 | Method | OnActionExecuted |
5 | Controller | OnActionExecuted |
6 | Global | OnActionExecuted |
提示每個控制器的基礎類別
Controller
包含OnActionExecuting
和OnActionExecuted
方法。其中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
屬性為非零值,否則按作用域的優先順序執行。
到此這篇關於ASP.NET Core MVC中過濾器工作原理的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45