尋夢新聞LINE@每日推播熱門推薦文章,趣聞不漏接❤️
ASP.NET Core程序現在變得如同控制台(Console)程序一般,同樣通過Main方法啟動整個應用。而Main方法要做的事情很簡單,創建一個WebHostBuilder類,調用其Build方法生成一個WebHost類,最後啟動之。
做到代碼一目了然:
要想探尋其內部究竟做了哪些操作,則需要調查下WebHost類中CreateDefaultBuilder靜態方法:
代碼稍微有點多,但這里只關心WebHostBuilder類的創建,以及該builder使用了UseKestrel方法。
UseKestrel方法內部通過IoC的方式注入了KestrelServer類:
由此可以知道當一個ASP.NET Core應用程序運行起來時,其內部會有KestrelServer。
那麼為什麼會需要這個KestrelServer?因為它可以做為一個反向代理服務器,幫助ASP.NET Core做到跨平台的需要。
以傳統Windows系統上的IIS為例,如下圖所示,ASP.NET Core應用程序中的代碼已經不再直接依賴於IIS容器,而是通過KestrelServer這個代理將HTTP請求轉換為HttpContext對象,再對此對象進行處理。
圖中的ASP.NET Core Module也是由ASP.NET Core的誕生而引入的新的IIS模塊。它的主要功能是將Web請求重定向至ASP.NET Core應用程序。並且由於ASP.NET Core應用程序獨立運行於IIS工作進程之外的進程,它還負責對進程的管理。
ASP.NET Core Module的源碼由C++編寫,入口是main文件中的RegisterModule函數。
其函數內部實例化了CProxyModuleFactory工廠類。
pFactory = newCProxyModuleFactory;
而由這個工廠類創建的CProxyModule實例中有一個關鍵的CProxyModule::OnExecuteRequestHandler方法。它會創建FORWARDING_HANDLER實例,並調用其OnExecuteRequestHandler方法。
在此方法里就有那些核心的處理HTTP請求的操作。
在ASP.NET Core應用程序這端,CreateWebHostBuilder(args).Build().Run();代碼執行之後,會調用其對應的異步方法:
該方法中又調用了WebHost的StartAsync方法:
BuildApplication方法內部從IoC容器取出KestrelServer的實例:
最後調用KestrelServer的StartAsync方法:
到了這一步,KestrelServer終於可以監聽來自ASP.NET Core Module發出的HTTP請求,而ASP.NET Core應用程序也可以開始其自身的任務處理了。
原文地址:https://www.cnblogs.com/kenwoo/p/9309264.html