前言
書承接上文,我們們上回說到,.net core中各種日誌框架, 今天我講講.net core中的內建過濾器吧!
1.什麼是過濾器?
ASP.NET Core中的篩選器允許程式碼在請求處理管道中的特定階段之前或之後執行,從使用者傳送一個請求,到控制器處理完,在返回給使用者,在這個過程,請求會經歷多箇中介軟體,所謂的過濾器,就是在請求過程中,攔截請求,對請求進行處理,例如:許可權認證,異常處理等等。如下圖所示:
2.過濾器的分類
Authorization過濾器
:這個在所有的過濾器中最先執行,主要功能是檢測當前使用者是否許可權訪問,如果沒有許可權就直接短路(終止請求,返回HTTP:401),不會先下執行。這裡需要特別注意一下,因為授權過濾器是最先執行,如果它有異常需要小心處理,因為它不會向下執行,所以不會到Exception過濾器,這點需要注意。Resource過濾器
:這個過濾器是緊跟著Authorization過濾器後面的過濾器,OnResourceExecuting在模型繫結之前執行程式碼,在管道的其餘部分完成之後,OnResourceExecuted執行程式碼。Action過濾器
:在呼叫動作方法之前和之後立即執行程式碼,可以監控並修改傳遞給操作的引數,同時也能監控並修改返回的結果。(微軟說在Razor Pages不支援這個過濾器)Exception過濾器
:將全域性策略應用於在寫入響應主體之前發生的未處理異常,監聽全域性的異常處理。Result過濾器
:在執行操作結果之前和之後立即執行程式碼,緊跟著Action過濾器,對action返回的結果可以進行資料格式轉換。
2.1過濾器的執行順序:
Authorization-->Resource-->Action-->Exception-->Result
2.2客戶端傳送一個請求到服務端的過程
3.預設執行順序
先是執行全域性,再到控制器,最後到具體的方法,然後返回到控制器,最後到全域性。這裡說的執行順序,是過濾器在不同作用域的執行順序。
4.為什麼要使用過濾器?
過濾器的分類我己經介紹完畢,想必大家對過濾器有初步的瞭解,知道它是什麼,能做哪些事,你肯定會有疑問,我們為什麼要使用過濾器?
答:當我們客戶端向服務端傳送請求的時候,如果此時我需要驗證使用者是否登入,如果不使用過濾器的方式去驗證,那在我們每一個傳送請求之前,我們都需要去服務端認證當前是否有使用者登入,當前的使用者是否擁有訪問許可權,這樣需要把同一份驗證程式碼,反覆複製,這不僅會增加工作量,一旦有新需求,改動很麻煩,如果使用過濾器去認證,這樣只需要修改服務端的程式碼,就可以達到一勞永逸,即使以後有修改,只需要修改服務端的邏輯即可。
5.總結
至此,我們已經瞭解過濾器是什麼(what),為什麼需要使用過濾器(why),過濾器在什麼時候用(when),接下來幾篇就開始講講如何使用(how)。