iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 13
0
Modern Web

ASP.NET Core 入門實戰30天系列 第 13

Day 13 Controller Initialization

  • 分享至 

  • xImage
  •  

本篇重點

ASP .NET Core MVC Controller期間會執行的事
Filter
Authorization Filter


前言

前面提到了MVC的生命週期
也說明了Model的部分
今天要來整理一下Controller
也要在提到生命週期裡面Controller會處理的事情


Controller

首先來看到一張之前在提到生命週期的流程圖

藍色的部分是Controller所負責的內容
包含了Controller Initialization 以及 Action method
紅色部分(Controller Initialization)則是本篇要討論的重點


Filter

在進入到Controller前
需要提一下Filter
Filter 是在Controller進入到每個動作的前後
分別做的一些額外的處理
可能是驗證授權的機制或是一些基本驗證等等
ASP .NET MVC本來有的Filter機制
在 .NET Core也沿用下來

主要依序有:

  • Authorization Filters
  • Resource Filters
  • Middleware Filters
  • Action Filters
  • Result Filters
  • Exception Filters

搭配request進來到Controller並回傳的行為
整個流程如下

另外要注意的是

  • Action filter,Result filter都是雙向的
    在進入action 和 Result和離開後都會在執行一次

  • Result filter結束後會再回到Middleware filter 以及Resource filter

  • 關於Middleware filter, 比較少人討論到,但在微軟官網是有提到這個filter的,因為叫做Middleware filter實在很容易跟最前面的Middleware搞混

    (資料來源:微軟官網)

這邊要討論的是再進來Controller的一開始
也就是紅色框框的範圍
會經過的三個Filters為

Authorization Filter
Resource filter
Middleware filter


Authorization Filter

主要是處理request進來的一些驗證
舉個例子今天網站臨時要維護中
要禁止所有的user登入進來
這個情境就可以使用Authorization去處理

首先先在專案上新增一個提醒頁面
這邊就純粹是一個簡單的HTML檔案

  1. 新增設定檔
    由於我們要使用動態的設定所以在這裡新增一個設定檔
 "PageSwtiches": {
    "stopview": true
  }

  1. 新增Filter
    新增一個叫做DoNotViewAuthFilter的Filter
    繼承了IAuthorizationFilter這個介面
    並實作了OnAuthorization這個方法
    主要的邏輯就是寫在這個方法裡面去控制
    在這邊取出設定檔得值,並決定要顯示的頁面

  2. 在controller使用Filter
    在ASP .NET Core 使用Filter的方式為

[TypeFilter(typeof(XXXXXFilter))]

Filter也可以針對某個action或使整個Controller
這裡直接先加到整個Controller

  1. 執行結果
    會導到對應的頁面,如果要換回來直接改設定檔就可以了
    也不需要重新啟動


接下來的
Resource filter以及Middleware filter
明天會再接續這個部分

參考資料
https://code-maze.com/filters-in-asp-net-core-mvc/

https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/filters?view=aspnetcore-3.1

https://ithelp.ithome.com.tw/articles/10195407


上一篇
Day 12 Model
下一篇
Day 14 Action filter
系列文
ASP.NET Core 入門實戰30天30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言