[ASP.NET Core] 加入Filter和Middleware

加入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容器註冊