筆記 ASP.NET MVC 的框架生命週期,從而在開發時採用最佳的擴充點來達成客製化的需求。
說明
Summary
UrlRoutingModule:用於處理 HTTP 請求的 URL,將其解析為路由資訊。它實現了 IHttpModule 介面,並且在 ASP.NET MVC 應用程式啟動時被自動註冊,負責監聽 HTTP 請求事件並處理該請求的路由信息。
MvcHandler:處理 HTTP 請求並生成 HTTP 回應,用於將路由資訊轉換為控制器與動作方法。實現了 IHttpHandler 介面,並且在 URL 路由解析後,調用該請求的控制器動作方法並生成 HTTP 回應。
DefaultControllerFactory:負責根據控制器名稱和命名空間名稱查找並創建控制器實例。實現了 IControllerFactory 介面,當控制器實例被創建時,ASP.NET MVC 框架會自動調用 CreateController 方法。
ControllerActionInvoker:負責調用控制器的動作方法,以及處理 Action 的參數綁定、模型綁定、驗證、Filter 處理等功能。實現了 IActionInvoker 介面,當控制器動作方法被呼叫時,ASP.NET MVC 框架會自動調用 InvokeAction 方法。
DefaultModelBinder:負責模型綁定,將 HTTP 請求中的參數映射到動作方法的參數或控制器的屬性上。實現了 IModelBinder 介面,當 ASP.NET MVC 框架需要將 HTTP 請求參數映射到動作方法參數時,它會自動調用 BindModel 方法。
ActionResult:定義了 MVC 應用程式中回傳的各種結果類型,例如 ViewResult、JsonResult、ContentResult 等。實現了 IActionResult 介面,當控制器動作方法完成時,會回傳 ActionResult 物件,這個物件可以將回應資料轉換為 HTTP 回應並返回給客戶端。
項目 | 用途 | 所屬分類或介面 |
---|---|---|
Global.asax | 當 ASP.NET 應用程式啟動時,用於處理應用程式層級的事件 | N/A |
HttpModule | ASP.NET 中可讓您攔截 HTTP 要求、響應和錯誤的基礎結構 | IHttpModule |
RouteTable.Routes.GetRouteData | 從請求中檢索可用於路由的路由資料 | RouteTable, RouteCollection, IRouteCollection |
RouteBase | 定義路由的方法和屬性 | N/A |
RouteData | 包含經過路由處理的路由的資訊,如路由值和路由處理程式等 | N/A |
IRouteHandler | 定義用於處理請求的自訂路由處理程式的契約 | IRouteHandler |
RequestContext | 包含有關目前 HTTP 要求的資訊,如 HTTP 內容、路由資訊和 HTTP 設定等。 | N/A |
UrlRoutingModule | 根據請求資訊查找與要求匹配的路由 | UrlRoutingModule, IHttpModule |
Get HttpHandler From RouteData | 從路由資料中取得相對應的 HttpHandler | MvcRouteHandler |
Route | 定義路由模式、預設值和約束 | Route |
MvcRouteHandler | 呼叫 Controller Action Invoker 的 HttpHandler | MvcRouteHandler |
MvcHandler | 建立、執行控制器,以及呼叫操作方法 | |
ControllerBuilder | 用於設定和創建控制器類型的物件 | IControllerFactory |
DefaultControllerFactory | 創建控制器實例的預設實作 | IControllerFactory |
IController | 定義控制器的方法和屬性 | N/A |
ControllerBase | 提供所有控制器的共用屬性和方法,但沒有動作執行 | ControllerBase |
Return DefaultControllerFactory | 回傳預設的控制器工廠 | ControllerBuilder |
Return MvcHandler | 回傳用於執行控制器和呼叫操作方法的 HttpHandler | MvcRouteHandler |
Return ControllerBase | 回傳實際的控制器執行個體 | MvcHandler |
IActionInvoker | 定義控制器動作方法的執行邏輯 | N/A |
ControllerActionInvoker | 負責執行 Action,呼叫 Action 的方法並回傳 ActionResult | ControllerActionInvoker |
IModelBinder | 用來將 HTTP 請求中的資料繫結到 Controller 的參數上 | N/A |
DefaultModelBinder | IModelBinder 的預設實作 | IModelBinder |
Return ControllerActionInvoker | 回傳 ControllerActionInvoker 實例 | DefaultControllerFactory |
ActionResult | 回傳結果,例如 View 或 JSON 資料等 | ActionResult |
RawContentResult | 回傳純文字資料 | ActionResult |
Detailed
Application & Request Life Cycle Events
HttpApplication: An instance of the HttpApplication class is created to start the application lifecycle.
ASP.NET 的應用程式生命週期(Life Cycle)可以分為下列階段:
Application Start:當應用程式啟動時,會建立一個 Application 對象來代表應用程式。在這個階段中,會進行一些應用程式級別的初始化工作,例如路由設定、組態設定、設定網站主題等。
PostResolveRequestCache:在這個階段中,當請求到達伺服器後,ASP.NET 會試圖解析請求路徑並從快取中取得頁面。如果頁面存在於快取中,則直接傳回快取的頁面。否則,會繼續進入下一個階段,也就是執行 IHttpHandler 的 ProcessRequest 方法。
ProcessRequest:在這個階段中,ASP.NET 會將請求傳遞給正確的 IHttpHandler 物件,讓其處理請求並產生回應。這個階段是 ASP.NET 生命週期中最重要的階段,因為大部分的請求處理邏輯都是在這個階段中實現的。
PostAcquireRequestState:在這個階段中,ASP.NET 會從狀態服務中取得當前請求的狀態資訊,並將其儲存在 HttpContext.Current.Items 集合中。這些狀態資訊可以包括 Session、Application、ViewState 等等。
PostRequestHandlerExecute:在這個階段中,IHttpHandler 物件已經處理完當前請求並傳回了回應。在這個階段中,可以對回應進行後處理,例如壓縮回應內容、設定緩存控制等等。
ReleaseRequestState:在這個階段中,ASP.NET 會釋放當前請求的狀態資訊。如果啟用了 Session 狀態,則會將其儲存在 Session 狀態服務中。
UpdateRequestCache:在這個階段中,ASP.NET 會將當前請求的回應儲存在快取中,以便下一次相同的請求可以直接從快取中取得頁面。
LogRequest:在這個階段中,ASP.NET 會記錄當前請求的相關資訊到日誌中,例如請求的 HTTP 方法、URL、請求時間、回應時間等等。
EndRequest:在這個階段中,ASP.NET 已經完成了整個請求/回應的處理過程,並將結果返回給 Client Side 。在這個階段中,可以進行一些清理工作,例如釋放資源、關閉連接等等。
HttpHandlers & HttpModules
HttpModule: The HttpModule pipeline is initialized, allowing additional functionality to be added to the request pipeline, including the Routing Module.
- IHttpModule
- The interface for defining a custom HttpModule.
- RouteCollection
- A collection of Route objects that are used to match incoming URLs to the appropriate controllers and actions.
- Route
- A class that defines a URL pattern and the controller and action to be used for that pattern.
- RouteBase
- The base class for defining custom route implementations.
- IRouteHandler
- The interface for defining a custom route handler.
- MvcRouteHandler
- The default route handler for processing requests that match an MVC route.
HttpHandler: The MvcHandler processes the response generated by the ActionResult.
- IHttpHandler
- The interface that HttpHandlers must implement.
- MvcHandler
- The HttpHandler responsible for processing requests that match an MVC route.
Routing: The Routing Module determines the appropriate controller and action based on the incoming URL.
在 ASP.NET MVC 中,HTTP 模組 (HttpModules) 可以協助判斷路由,讓應用程式能夠根據請求的 URL 路徑找到對應的控制器和動作方法。HTTP 模組可以從 HTTP 請求中取得 URL,然後解析出其中的路由資訊,並根據路由規則將其轉換為控制器和動作方法的名稱。
在 ASP.NET MVC 中,HTTP 模組的路由解析功能通常是由 Routing HTTP 模組處理的。Routing HTTP 模組會在應用程式啟動時加載,並註冊在 ASP.NET 的 HTTP 請求管道中。當應用程式收到 HTTP 請求時,HTTP 請求管道會透過 Routing HTTP 模組來解析請求的 URL,並將其轉換為對應的控制器和動作方法。
Routing HTTP 模組可以根據路由規則來解析 URL。路由規則是定義在 RouteConfig.cs 檔案中的,可以根據應用程式需求進行自訂。每個路由規則都包含一個 URL 模式、一個可選的預設控制器和動作方法,以及一些可選的參數。當 Routing HTTP 模組解析 URL 時,它會將 URL 與每個路由規則進行比對,找到第一個符合 URL 的規則,然後根據規則將 URL 轉換為對應的控制器和動作方法。
總之,HTTP 模組可以協助判斷路由,讓 ASP.NET MVC 應用程式能夠根據請求的 URL 路徑找到對應的控制器和動作方法。Routing HTTP 模組是 ASP.NET MVC 中負責路由解析的核心模組,可以根據路由規則來解析 URL,找到對應的控制器和動作方法。
正確的名稱是UrlRoutingModule,這個類別是實現 ASP.NET MVC 中路由功能的主要類別之一。UrlRoutingModule 實現了 IHttpModule 介面,並在 ASP.NET 的 HTTP 請求管道中註冊,以便能夠處理傳入的 HTTP 請求。當應用程式收到 HTTP 請求時,UrlRoutingModule 會從請求中獲取 URL 資訊,然後根據路由規則進行解析,找到對應的控制器和動作方法。
在 ASP.NET MVC 5 及更早版本中,UrlRoutingModule 是實現路由功能的主要類別。但在 ASP.NET Core 中,Routing HTTP 模組已經被完全重寫,並且使用了全新的路由系統,因此與 ASP.NET MVC 中的 UrlRoutingModule 已經不同。不過,UrlRoutingModule 仍然是 ASP.NET MVC 5 及更早版本中非常重要的類別之一,負責處理請求路由並將其路由到適當的控制器和動作方法。
當 HTTP 請求進入 ASP.NET MVC 應用程式後,會由 ASP.NET 的 HTTP 請求管道進行處理。HTTP 請求管道是由一系列的 HTTP 模組 (HttpModules) 組成,其中包括 ASP.NET MVC 的 UrlRoutingModule。當 HTTP 請求進入到 UrlRoutingModule 時,UrlRoutingModule 會根據路由規則解析 URL,找到對應的控制器和動作方法。
當 UrlRoutingModule 找到對應的控制器和動作方法之後,就會建立一個控制器類別的實例。這個實例會在控制器初始化 (Controller Initialization) 階段建立,並會負責處理該請求的所有相關邏輯。
控制器初始化是在控制器類別的實例建立之後執行的,其目的是確保控制器及其相關資源都已經準備好,並且可以正確地處理該請求。在控制器初始化階段,ASP.NET MVC 會執行以下幾個步驟:
建立控制器的實例,並設置其相關屬性。
設置控制器的 ActionInvoker 物件,以處理動作方法的呼叫。
執行控制器的 ActionFilters,這些過濾器可以在執行動作方法之前或之後進行額外的處理。
執行控制器的 Initialize 方法,這個方法可以用來初始化控制器的相關資源。
設置控制器的 ViewData 和 TempData 屬性,以傳遞資料給視圖。
呼叫動作方法。
總之,當 Request 進入到 ASP.NET MVC,並交由 UrlRoutingModule 處理後,UrlRoutingModule 會建立一個控制器類別的實例,然後進行控制器初始化。控制器初始化是確保控制器及其相關資源都已經準備好,並且可以正確地處理該請求的重要階段。
當 UrlRoutingModule 找到對應的控制器和動作方法之後,會呼叫 MvcHandler 的 ProcessRequest 方法,該方法負責處理請求並呼叫相應的控制器動作方法。
簡單來說,UrlRoutingModule 會根據路由規則解析 URL,找到對應的控制器和動作方法,然後將處理權限轉交給 MvcHandler。MvcHandler 會負責進一步處理請求,包括建立控制器的實例、呼叫控制器動作方法、返回結果等操作。在這個過程中,控制器初始化是其中的一個重要階段。感謝你的指正,希望這次能回答到你的問題。
UrlRoutingModule 會根據路由規則解析 URL,找到對應的控制器和動作方法。它使用的類別、介面和方法如下:
- RouteCollection:負責儲存所有路由規則,UrlRoutingModule 會使用該類別中的方法來查找匹配的路由。
- IRouteHandler:定義了一個方法 GetHttpHandler,該方法負責處理路由請求,返回一個 IHttpHandler 介面的實例。
- IRouteConstraint:定義了一個方法 Match,該方法負責驗證 URL 的路由參數是否符合要求。
- Route:表示一個路由規則,其中包含了 URL 模式、路由規則的名稱、 Default 值和約束條件等設置。
- RouteData:表示路由規則解析 URL 後的結果,其中包含了控制器名稱、動作方法名稱、路由規則的名稱、URL 參數等相關資訊。
- RouteBase:是 Route 和 RouteCollection 的基類,定義了一些共用的方法和屬性。
UrlRoutingModule 會根據 RouteCollection 中設置的路由規則,逐一進行匹配。當找到匹配的路由規則後,UrlRoutingModule 會建立一個 RouteData 物件,該物件包含了控制器名稱、動作方法名稱、路由規則的名稱、URL 參數等相關資訊。然後,UrlRoutingModule 會將該 RouteData 物件傳遞給 MvcHandler,MvcHandler 根據 RouteData 中的資訊來建立相應的控制器和動作方法的實例,並執行該動作方法。
簡而言之,UrlRoutingModule 使用 RouteCollection 中的路由規則來解析 URL,找到匹配的路由規則後,建立 RouteData 物件並將其傳遞給 MvcHandler,由 MvcHandler 進一步處理該請求,建立控制器的實例並執行動作方法。
在 MvcHandler 中,會依序進行以下幾個方法:
GetHttpHandler:這個方法是 IRouteHandler 定義的方法,該方法負責返回一個實現了 IHttpHandler 介面的類別的實例,一般情況下,這個實例會是 MvcHandler 本身。
ProcessRequestInit:這個方法負責初始化 RequestContext 和 ControllerContext 等上下文資訊,該方法包含在抽象基類中,具體實現在 MvcHandler 派生類中。
ProcessRequest:這個方法負責調用相應的控制器和動作方法,並將結果返回給 Client Side ,具體實現在 MvcHandler 派生類中。
相關的類別和介面如下:
IRouteHandler:定義了 GetHttpHandler 方法,該方法返回一個實現了 IHttpHandler 介面的類別的實例。
MvcHandler:實現了 IRouteHandler 和 IHttpHandler 介面,負責處理 ASP.NET MVC 請求的主要類別,其中包含了 ProcessRequestInit 和 ProcessRequest 方法。
RequestContext:表示當前請求的上下文資訊,包含了 HTTPContext、RouteData 和相關的請求資訊等。
ControllerContext:表示當前控制器的上下文資訊,包含了當前的 HttpContext、當前控制器的名稱和相關資訊等。
ControllerBase:所有控制器的基底類別,包含了一些共用的屬性和方法,例如 HttpContext、TempData 等。
Controller:實現了 ControllerBase 類別,代表了 MVC 應用程序中的控制器,其中包含了 Action 方法和相關的屬性和方法。
總體來說,當收到請求後,UrlRoutingModule 會將路由資訊傳遞給 MvcHandler,MvcHandler 會負責處理該請求,這個過程包含了一系列的方法調用,其中主要包含了 ProcessRequestInit 和 ProcessRequest 方法。在這個過程中,涉及到的類別和介面包括了 IRouteHandler、MvcHandler、RequestContext、ControllerContext、Controller 和 ControllerBase。
RouteTable
RouteTable 是一個 ASP.NET MVC 中的靜態類別,用於管理網站的路由規則。它的主要作用是儲存所有網站所使用的路由規則,並提供方法讓開發人員可以動態地新增或刪除路由。RouteTable 會在應用程式啟動時被初始化,並且會在收到請求時被用來尋找符合路由規則的處理程序。
在 ASP.NET MVC 中,RouteTable 屬於 System.Web.Routing 命名空間下的類別,繼承自 RouteCollection。它實現了 IRouteHandler 和 IUrlHelper,同時還提供了一些方法,例如 Add()、Clear()、GetVirtualPath() 等,用於管理路由規則。開發人員可以通過修改 RouteTable 的屬性和調用方法,來建立自己的路由規則。
簡而言之,RouteTable 是 ASP.NET MVC 中用於管理路由規則的類別,負責將傳入的請求與路由規則進行比對,並返回符合要求的路由對應的處理程序。
在 ASP.NET MVC 中,路由(Routing)是一個非常重要的機制,可以讓應用程序根據 URL 請求來匹配對應的控制器和操作方法。以下是與路由相關的類別、介面和方法的說明:
RouteBase:定義了路由的基本行為和屬性,包括匹配 URL、獲取路由參數等。所有的路由類都必須繼承自這個類別。
RouteDictionary:是一個字典類別,用於存儲路由的名稱和路由對象。
RouteTable:是一個靜態類別,用於管理應用程序中的所有路由。它包含一個靜態的 Routes 屬性,用於獲取和設置路由列表。
RouteData:表示一個路由的路由參數(Route Parameters),例如控制器名稱、動作方法名稱等。這些參數可以通過路由匹配 URL 得到。
IRouteHandler:定義了一個方法 GetHttpHandler,它返回一個 IHttpHandler 對象,用於處理匹配的路由。
當應用程序收到一個請求時,它會通過 UrlRoutingModule 進行處理。UrlRoutingModule 會根據 RouteTable 中的路由配置來進行路由匹配,並返回一個 RouteData 對象。然後,MvcRouteHandler 會通過 RouteData 中的路由參數來獲取控制器和動作方法,並創建一個 MvcHandler 對象來處理請求。
在 MvcHandler 中,ControllerBuilder 會負責創建控制器對象,並調用該控制器的操作方法。在執行操作方法之前,ControllerActionInvoker 會根據請求中的參數值來執行模型繫結(Model Binding)操作,並檢查是否有任何過濾器(Filter)需要執行。最後,ControllerActionInvoker 會返回一個 ActionResult 對象,用於生成輸出內容。
在 ActionResult 中,可以定義返回給客戶端的內容,例如 ViewResult 會使用 View Engine 來生成 HTML 代碼,而 RawContentResult 會返回原始的字節流。
RouteBase 是 Route 的抽象基礎類別,定義了處理路由請求的規範。Route 則是 RouteBase 的具體實現,繼承了 RouteBase 的規範,實現了具體的路由規則,例如定義了 URL 模板、默認值、約束條件等。
RouteDictionary 是一個繼承自 Dictionary 的自定義字典類別,用於儲存路由規則。它的索引鍵是路由的名稱,索引值是 RouteBase 物件。
RouteTable 是 ASP.NET MVC 應用程式中的一個靜態類別,用於註冊和儲存路由規則。它維護一個 RouteDictionary,提供了添加、移除和查詢路由規則的方法。
RouteData 是在處理路由請求時創建的一個包含路由相關資訊的物件,例如路由名稱、控制器名稱、動作方法名稱、路由參數等。RouteData 類別提供了許多屬性和方法,用於訪問和操作這些資訊。
IRouteHandler 是一個介面,定義了處理路由請求的方法 GetHttpHandler。該方法接受一個 RequestContext 物件作為引數,返回一個實現了 IHttpHandler 介面的物件,通常是 MvcHandler。 MvcRouteHandler 是 IRouteHandler 的一個具體實現,用於處理路由請求並返回 MvcHandler。
Controller Initialization
Controller creation: The controller instance is created.
- IControllerFactory
- The interface for defining a custom controller factory.
- DefaultControllerFactory
- The default implementation of IControllerFactory.
- IController
- The interface that controllers must implement.
- ControllerBase
- The base class for defining custom controller implementations.
在 Controller 初始化後,下列方法、類別以及介面會按照以下順序依次執行:
Action Invoker:Action Invoker 會負責處理與動作方法相關的邏輯。首先,它會找到相應的動作方法,接著,它會通過 Controller ActionInvoker 屬性中的實例來執行該方法。Action Invoker 是一個抽象基類,具體實現在 ControllerActionInvoker 類別中。
Authorization Filters:當 Action Invoker 決定了要調用哪個動作方法後,會執行 Authorization Filter。Authorization Filter 是 ASP.NET MVC 提供的一個機制,它可以讓開發人員對動作方法進行權限檢查。如果任何一個 Authorization Filter 返回了 HTTP 狀態碼,MVC 框架就不會繼續執行該動作方法。Authorization Filter 可以在 Action 方法或 Controller 上定義。
Action Filters:當 Authorization Filters 執行完畢後,MVC 框架就會執行 Action Filters。Action Filter 是一個自定義類別,它可以在執行動作方法之前和之後執行額外的邏輯。Action Filters 可以用來實現輸入驗證、日誌記錄、性能測試和結果緩存等功能。Action Filter 可以在 Action 方法或 Controller 上定義。
Model Binding:在執行動作方法之前,MVC 框架會將 Client Side 的 HTTP 請求參數與動作方法參數進行綁定,並將綁定後的結果傳遞給動作方法。Model Binding 可以將 Client Side 的 HTTP 請求參數綁定到基本類型、複雜對象或集合類型中。如果綁定失敗,MVC 框架會將錯誤信息添加到 ModelState 物件中。
Action Execution:MVC 框架會調用動作方法本身。該方法會使用 Model Binding 後的參數,然後返回一個 ActionResult 物件,ActionResult 物件封裝了該動作方法執行的結果。
Result Filters:當 Action Execution 完畢後,MVC 框架會執行 Result Filters。Result Filter 是一個自定義類別,它可以在動作方法執行之後對 ActionResult 物件進行修改,例如,添加 HTTP 標頭或執行結果緩存等操作。Result Filter 可以在 Action 方法或 Controller 上定義。
在 Controller 初始化後,下列方法、類別以及介面會按照以下順序依次執行:
IControllerFactory:IControllerFactory 會負責創建 Concrete 的 Controller 實例,它是 ASP.NET MVC 提供的一個 Extension,可以讓開發人員替換 Default 的 Controller Factory。在 ASP.NET MVC 中, Default 的 Controller Factory是 DefaultControllerFactory。
CreateController 方法:DefaultControllerFactory 會調用 CreateController 方法,根據傳入的 ControllerContext 創建 Concrete 的 Controller 實例。CreateController 方法需要實現 IControllerFactory 介面。
BeginExecute 方法:在創建 Controller 實例後,MVC 框架會調用 Controller 的 BeginExecute 方法。BeginExecute 方法是 Controller 的生命週期中的一個關鍵方法,它負責準備 Controller 的狀態,例如,設置 HttpContext、Route Data 和 ControllerContext 等。
CreateActionInvoker 方法:Controller 的 BeginExecute 方法會調用 CreateActionInvoker 方法,創建一個 Action Invoker 實例。Action Invoker 會負責處理與動作方法相關的邏輯。在 ASP.NET MVC 中, Default 的 Action Invoker 是 ControllerActionInvoker。
Action Invoker:Action Invoker 會負責找到相應的動作方法,並且通過 Controller ActionInvoker 屬性中的實例來執行該方法。
Authorization Filters:當 Action Invoker 決定了要調用哪個動作方法後,會執行 Authorization Filter。
Action Filters:當 Authorization Filters 執行完畢後,MVC 框架就會執行 Action Filters。
Model Binding:在執行動作方法之前,MVC 框架會將 Client Side 的 HTTP 請求參數與動作方法參數進行綁定。
Action Execution:MVC 框架會調用動作方法本身。
Result Filters:當 Action Execution 完畢後,MVC 框架會執行 Result Filters。
ControllerActionInvoker 是在 ASP.NET MVC 中用來執行控制器動作方法的類別。當控制器接收到由 ASP.NET MVC 應用程式的路由引擎分發的 HTTP 請求時,ControllerActionInvoker 負責呼叫相應的控制器動作方法。以下是 ControllerActionInvoker 運作的過程和涉及的相關類別、介面和方法:
接收 HTTP 請求
當路由引擎成功地將 HTTP 請求路由到控制器時,ControllerActionInvoker 會開始執行。這時,控制器動作方法的參數還未綁定。
判斷 Action Method 的存在與權限
ControllerActionInvoker 會檢查控制器類別中是否有與路由匹配的動作方法。如果找到該方法,則 ControllerActionInvoker 會檢查使用者是否有執行該方法的權限。
選擇 Action Method
當 ControllerActionInvoker 確定使用者有權限執行動作方法時,它會選擇要呼叫的方法。在選擇動作方法時,ControllerActionInvoker 會考慮傳入的參數和動作方法的名稱和類型。
綁定動作方法的參數
一旦 ControllerActionInvoker 選擇了要呼叫的動作方法,它會使用 Model Binding 綁定該方法的參數。Model Binding 會將 HTTP 請求中的值映射到控制器動作方法的參數上,並將該參數傳遞給方法。
Action Filter 的執行
在執行控制器動作方法之前,ControllerActionInvoker 會呼叫所有相關聯的 Action Filter。Action Filter 是 ASP.NET MVC 中用來執行額外處理的類別,例如驗證使用者、記錄日誌和檢查緩存。
Action Method 的執行
當 ControllerActionInvoker 完成所有必要的前置作業後,它會呼叫控制器動作方法。這時,動作方法的參數已經綁定,可以正確地呼叫該方法。
ActionResult 的產生
當動作方法完成後,ControllerActionInvoker 會產生 ActionResult。ActionResult 描述控制器應用程式對 HTTP 請求的回應方式。例如,它可以回傳檔案、檢視或 JSON 資料。
Result Filter 的執行
在 ActionResult 產生後,ControllerActionInvoker 會呼叫所有相關聯的 Result。
ControllerActionInvoker
當 ControllerActionInvoker 負責呼叫正確的 Action 方法後,它會根據 Action 方法所需要的參數進行參數繫結(Parameter Binding)。
在 ASP.NET MVC 中,參數繫結是由 IModelBinder 介面及其實作來實現的。當 ControllerActionInvoker 需要將參數繫結到 Action 方法的參數上時,它會透過 ModelBinderProvider 從註冊的 IModelBinder 實例中選擇適當的 Model Binder 來進行參數繫結。當然,如果沒有註冊適當的 Model Binder,ASP.NET MVC 也會嘗試使用預設的 Model Binder 來進行繫結。
一旦參數繫結完成後,ControllerActionInvoker 就會執行 Action 方法並得到其回傳的 ActionResult 物件。這個 ActionResult 物件會被透過 Model Binding 以及 View Engine 所提供的機制進行渲染,最後回傳到使用者的瀏覽器中。
總結來說,ControllerActionInvoker 是 ASP.NET MVC 中的一個關鍵類別,它負責將 Request 路由到正確的 Controller 和 Action 方法上,並進行必要的參數繫結、Action 方法執行以及 ActionResult 物件渲染等操作。在這個過程中,它與多個相關的類別、介面以及方法進行互動,包括 IActionInvoker、IModelBinder、ModelBinderProvider、IViewEngine、ActionResult 等。
ControllerBuilder
ControllerBuilder 是 ASP.NET MVC 框架中的一個靜態類別,位於 System.Web.Mvc 命名空間中,用於提供一些靜態方法和屬性,可以設置和訪問與控制器和操作相關的組件,如 IControllerFactory、IActionInvoker 和 ModelBinderProviders 等。
具體來說,ControllerBuilder 的主要用途如下:
設置和獲取全局 IControllerFactory 對象,控制控制器的創建和實例化。
設置和獲取全局 IActionInvoker 對象,控制操作方法的調用和執行。
設置和獲取全局的模型繫結器提供程序(ModelBinderProviders),它提供了一組用於將 HTTP 請求數據轉換為操作方法參數的模型繫結器。
設置和獲取全局的過濾器提供程序(FilterProviders),它提供了一組用於執行操作方法前後的過濾器。
除此之外,ControllerBuilder 還提供了一些其他的方法和屬性,如 GetControllerSessionBehavior、GetService 和 SetControllerFactory 等,用於控制控制器和操作的行為。
需要注意的是,ControllerBuilder 並不是一個介面,而是一個靜態類別。
Action Method Execution
Action Execution: The MvcHandler executes the appropriate action method in the controller.
- MvcHandler
- The HttpHandler responsible for processing requests that match an MVC route.
- IActionInvoker
- The interface for defining a custom action invoker.
- ControllerActionInvoker
- The default implementation of IActionInvoker.
- Model binding
- The process of mapping incoming request data to action method parameters.
- IModelBinder
- The interface for defining a custom model binder.
- DefaultModelBinder
- The default implementation of IModelBinder.
- Action filters
- A set of filters that run before and after an action method.
- IActionFilter
- The interface for defining a custom action filter.
- Authorization filters
- A type of action filter that runs before the action method to verify that the user is authorized to access the requested resource.
- IAuthorizationFilter
- The interface for defining a custom authorization filter.
- Authentication filters
- A type of action filter that runs before the action method to authenticate the user.
- IAuthenticationFilter
- The interface for defining a custom authentication filter.
Model Binding
在 ASP.NET MVC 中,Model Binding 是將 HTTP 請求中的參數值綁定到 Controller 的 Action 方法的參數上。這樣就可以方便地從 HTTP 請求中獲取數據,並傳遞到 Action 方法中進行後續處理。
以下是 Model Binding 的過程:
準備要綁定的參數:MVC 框架從 HTTP 請求中獲取參數,包括Route Data 、表單數據、查詢字符串、cookie 等。
確定要綁定的參數:MVC 框架會通過 ActionDescriptor 找到要調用的 Action 方法及其參數,並確定哪些參數需要綁定。
創建綁定器:根據要綁定的參數的數據類型,MVC 框架會創建對應的綁定器。例如,如果參數是基本類型,則使用 ValueProviderResult。
綁定數據:使用綁定器將 HTTP 請求中的數據綁定到參數上。這是 Model Binding 的核心步驟,根據綁定器的不同,綁定數據的過程也會有所不同。
驗證數據:綁定器會對綁定後的數據進行基本的驗證,例如,確認數據是否符合數據類型等。
傳遞數據:綁定器將綁定後的數據傳遞給 Action 方法,讓其進行後續處理。
在 Model Binding 的過程中,涉及到的類別和介面包括:
IModelBinder:IModelBinder 是 ASP.NET MVC 中的一個介面,用於將 HTTP 請求中的數據綁定到 Action 方法的參數上。開發人員可以實現自定義的 IModelBinder,以擴展 Model Binding 的功能。
IValueProvider:IValueProvider 用於從 HTTP 請求中獲取參數值,並將其傳遞給 IModelBinder。
IModelBinderProvider:IModelBinderProvider 負責創建 IModelBinder 的實例,並根據參數的數據類型來選擇適合的 IModelBinder。在 ASP.NET MVC 中, Default 的 IModelBinderProvider 是 DefaultModelBinderProvider
Action Results & View Engine
ActionResult Creation: The action method returns an ActionResult object, representing the result of the action.
- ActionResult
- The base class for representing the result of an action.
- ViewResult
- The class that represents a view result.
- PartialViewResult
- The class that represents a partial view result.
- JsonResult
- The class that represents a JSON result.
- ContentResult
- The class that represents a result containing a raw string.
Result Execution: The ActionResult is executed to generate the response to be sent to the client.
- ViewEngineResult
- The result of the view engine's attempt to locate a view.
- IView
- The interface for defining a custom view.
- RazorView
- The default view engine that is used to render Razor views.
- IViewEngine
- The interface for defining a custom view engine.
- ViewResultBase
- The base class for defining custom view result implementations.
在 ASP.NET MVC 中,ActionResult 負責將 Action 方法執行後得到的結果回傳給使用者的瀏覽器。它可以是純文字、JSON 資料、檔案下載、重導向等形式,而其中最常用的就是 ViewResult 了。ViewResult 負責渲染一個 View 並將結果回傳給使用者的瀏覽器。
當 ControllerActionInvoker 得到 ActionResult 後,它會將它傳遞給 ViewResultExecutor。ViewResultExecutor 是一個負責將 ViewResult 轉換成 HTML 的類別。它會透過 ViewEngineCollection 所提供的 View Engine 機制找到對應的 View 檔案,再將 Model 以及 ViewData 傳入 View 中進行渲染。
在 ASP.NET MVC 中,ViewEngine 負責將 View 檔案轉換成 HTML。ASP.NET MVC 預設提供了兩種 ViewEngine,即 WebFormViewEngine 與 RazorViewEngine。其中,WebFormViewEngine 負責將 Web Form 檔案轉換成 HTML,而 RazorViewEngine 則負責將 Razor 檔案轉換成 HTML。
當 ControllerActionInvoker 需要渲染 View 時,它會透過 ViewEngineCollection 所提供的機制選擇適當的 ViewEngine。ViewEngineCollection 是一個負責管理 ViewEngine 的集合類別。ASP.NET MVC 預設將 WebFormViewEngine 與 RazorViewEngine 加入了 ViewEngineCollection 中。當 ViewEngineCollection 找到適當的 ViewEngine 後,就會呼叫其 CreateView 方法建立對應的 View 物件,並傳入 Model 以及 ViewData 進行渲染。最終,ViewResultExecutor 會得到 View 的渲染結果並將其轉換成 HTML,然後回傳給使用者的瀏覽器。
總結來說,ASP.NET MVC 的 ActionResult 與 ViewEngine 機制是負責將 Action 方法的結果轉換成 HTML 並回傳給使用者的瀏覽器的關鍵類別與機制。在這個過程中,涉及到多個相關的類別、介面以及方法,包括 ViewResult、ViewResultExecutor、ViewEngineCollection、WebFormViewEngine、RazorViewEngine、CreateView 等。在 ASP.NET MVC 中,ActionResult 負責將 Action 方法執行後得到的結果回傳給使用者的瀏覽器。它可以是純文字、JSON 資料、檔案下載、重導向等形式,而其中最常用的就是 ViewResult 了。ViewResult 負責渲染一個 View 並將結果回傳給使用者的瀏覽器。
當 ControllerActionInvoker 得到 ActionResult 後,它會將它傳遞給 ViewResultExecutor。ViewResultExecutor 是一個負責將 ViewResult 轉換成 HTML 的類別。它會透過 ViewEngineCollection 所提供的 View Engine 機制找到對應的 View 檔案,再將 Model 以及 ViewData 傳入 View 中進行渲染。
在 ASP.NET MVC 中,ViewEngine 負責將 View 檔案轉換成 HTML。ASP.NET MVC 預設提供了兩種 ViewEngine,即 WebFormViewEngine 與 RazorViewEngine。其中,WebFormViewEngine 負責將 Web Form 檔案轉換成 HTML,而 RazorViewEngine 則負責將 Razor 檔案轉換成 HTML。
當 ControllerActionInvoker 需要渲染 View 時,它會透過 ViewEngineCollection 所提供的機制選擇適當的 ViewEngine。ViewEngineCollection 是一個負責管理 ViewEngine 的集合類別。ASP.NET MVC 預設將 WebFormViewEngine 與 RazorViewEngine 加入了 ViewEngineCollection 中。當 ViewEngineCollection 找到適當的 ViewEngine 後,就會呼叫其 CreateView 方法建立對應的 View 物件,並傳入 Model 以及 ViewData 進行渲染。最終,ViewResultExecutor 會得到 View 的渲染結果並將其轉換成 HTML,然後回傳給使用者的瀏覽器。
總結來說,ASP.NET MVC 的 ActionResult 與 ViewEngine 機制是負責將 Action 方法的結果轉換成 HTML 並回傳給使用者的瀏覽器的關鍵類別與機制。在這個過程中,涉及到多個相關的類別、介面以及方法,包括 ViewResult、ViewResultExecutor、ViewEngineCollection、WebFormViewEngine、RazorViewEngine、CreateView 等。
參考資料
來自 深入研究蔣金楠(Artech)老師的MiniMvc(迷你MVC) 所整理的生命週期相關類別與介面:
Global.asax
HttpModule
RouteTable.Routes.GetRouteData
RouteBase
RouteData
IRouteHandler, Interface
RequestContext
UrlRoutingModule, Important Imlements
RequestContext
Get HttpHandler From RouteData
Route
MvcRouteHandler
MvcHandler, Important Imlements
ControllerBuilder
DefaultControllerFactory, Important Imlements
IController, Interface
ControllerBase
Return DefaultControllerFactory
Return MvcHandler
Return ControllerBase
IActionInvoker, Interface
ControllerActionInvoker, Important Imlements
IModelBinder, Interface
DefaultModelBinder, Important Imlements
Return ControllerActionInvoker
ActionResult, Important Imlements
RawContentResult