加入Filter和Middleware
某次面試的時候被面試官問了一個問題,“Global的Filter跟Action的Filter執行順序是怎樣呢?”
直覺思考肯定是Global優先吧!但心中又有一點點的不確定,所以決定乾脆寫個code來證實一下跟想像中的是一樣的
(順便也加個Middleware一起跑看看...)
1.首先建立一個Filter給Action用(Filter有分Async的版本,這篇一律都是用它)
2.接著掛在Action的頭上,這邊用[TypeFilter()]掛上Filter,這樣才可以享受DI的功能
3.再來建立一個Filter給Global用
4.接著在Startup上加入Global的Filter
5.再來建立一個Middleware,要注意Middleware對方法簽章和member有一些規範,詳細請參考微軟文件
https://docs.microsoft.com/zh-tw/aspnet/core/fundamentals/middleware/write?view=aspnetcore-3.1
6.同樣的掛進Startup裡面,放的位置是會影響執行順序的
7.接著把應用跑起來看看
8.證實了上述的執行順序為 Middleware > GlobalFilter > ActionFilter > Action,跟想像中的一樣,結束!
Source Code https://github.com/ianChen806/FilterSample/tree/master
(順便加上了RazorPge的範例,只差在Filter改實作IAsyncPageFilter)
微軟文件
https://docs.microsoft.com/zh-tw/aspnet/core/fundamentals/middleware/write?view=aspnetcore-3.1
https://docs.microsoft.com/zh-tw/aspnet/core/razor-pages/filter?view=aspnetcore-3.1
2020/4/3 補充
除了TypeFilterAttribute外,也可以使用 ServiceFilterAttribute,這兩者使用的方式差異不大,主要差在實例化的方式
TypeFilterAttribute:透過一個工廠來實例化,使用前不需要在DI容器註冊
ServiceFilterAttribute:透過DI容器來實例化,所以使用前必須先在DI容器註冊