任何「生命週期」的探討都是一門學問, ASP.NET MVC Life Cycle 的官網以及網路文獻也很多,今天找到一個淺顯易懂的版本 ASP.NET MVC - Life Cycle。
他將所謂的生命週期分兩個來探討, 然後再配上圖片 :
request 比較複雜, 但對 MVC 有概念的人大方向應該可以抓出一個順序: request → routing → controller → action → result → response。
提醒兩點, 應該有看到一個 Controller Intialization ? 順便分享一下, 過去曾有專案有效能問題, 結果是 Controller 建構子做了一些 AutoMapper.Attributes 的 mapping 動作, 天真以為他只會初始化一次。但 sorry, 是每一個請求都會進入構造函式, 這邊慢, 大家就一起漫步了。第二點, 不是每個 result 都需要 view engine 處理, 我們也可以回傳一個字串, JSON..., 對吧 ? 所以上圖 Result Execution 才會有兩種處理方式。
System.Web.Mvc / MvcHandler.cs 的 程式碼 也滿值得欣賞一下。是由 IControllerFactory 類來創建 Controller 實體去執行後續動作 :
是不是眼花撩亂 ? 其實 request 的生命周期不離開一開始介紹的原則 :
他將所謂的生命週期分兩個來探討, 然後再配上圖片 :
- The application life cycle
- The request life cycle
request 比較複雜, 但對 MVC 有概念的人大方向應該可以抓出一個順序: request → routing → controller → action → result → response。
提醒兩點, 應該有看到一個 Controller Intialization ? 順便分享一下, 過去曾有專案有效能問題, 結果是 Controller 建構子做了一些 AutoMapper.Attributes 的 mapping 動作, 天真以為他只會初始化一次。但 sorry, 是每一個請求都會進入構造函式, 這邊慢, 大家就一起漫步了。第二點, 不是每個 result 都需要 view engine 處理, 我們也可以回傳一個字串, JSON..., 對吧 ? 所以上圖 Result Execution 才會有兩種處理方式。
System.Web.Mvc / MvcHandler.cs 的 程式碼 也滿值得欣賞一下。是由 IControllerFactory 類來創建 Controller 實體去執行後續動作 :
protected internal virtual void ProcessRequest(HttpContextBase httpContext)
{
SecurityUtil.ProcessInApplicationTrust(delegate
{
IController controller;
IControllerFactory factory;
this.ProcessRequestInit(httpContext, out controller, out factory);
try
{
controller.Execute(this.RequestContext);
}
finally
{
factory.ReleaseController(controller);
}
});
}
再深入一點, 來看 Detailed ASP.NET MVC Pipeline 的大圖 :是不是眼花撩亂 ? 其實 request 的生命周期不離開一開始介紹的原則 :
- request → routing → controller → action → result → response
- request → routing → controller initialization → action execution → result execution → response
大圖版本 - 需要 rendering
- request → routing → controller initialization → action execution → result execution → view initialization & rendering → response
public class CustomAuthorizationAttribute : FilterAttribute, IAuthorizationFilter
{
public void OnAuthorization(AuthorizationContext filterContext)
{
bool isAuthorized = GoCheckToken(filterContext);
if (!isAuthorized)
{
filterContext.Result = new HttpUnauthorizedResult();
}
}
}
參考資料
- https://docs.microsoft.com/en-us/aspnet/mvc/overview/getting-started/lifecycle-of-an-aspnet-mvc-5-application
- http://www.dotnettricks.com/learn/mvc/aspnet-mvc-request-life-cycle
- https://www.tutorialspoint.com/asp.net_mvc/asp.net_mvc_life_cycle.htm
- https://www.tektutorialshub.com/asp-net-mvc-request-life-cycle/
- http://www.dotnettricks.com/learn/mvc/detailed-aspnet-mvc-pipeline
- https://github.com/mono/aspnetwebstack/blob/master/src/System.Web.Mvc/MvcHandler.cs
拜讀了幾篇相關文 獲益匪淺 感謝
ReplyDelete客氣了, 天天向上 ~
Delete