.NET Core開發日志——從ASP.NET Core Module到KestrelServer

尋夢新聞LINE@每日推播熱門推薦文章,趣聞不漏接❤️

加入LINE好友

ASP.NET Core程序現在變得如同控制台(Console)程序一般,同樣通過Main方法啟動整個應用。而Main方法要做的事情很簡單,創建一個WebHostBuilder類,調用其Build方法生成一個WebHost類,最後啟動之。

做到代碼一目了然:

要想探尋其內部究竟做了哪些操作,則需要調查下WebHost類中CreateDefaultBuilder靜態方法:

.NET Core開發日志——從ASP.NET Core Module到KestrelServer-雪花新聞

代碼稍微有點多,但這里只關心WebHostBuilder類的創建,以及該builder使用了UseKestrel方法。

UseKestrel方法內部通過IoC的方式注入了KestrelServer類:

.NET Core開發日志——從ASP.NET Core Module到KestrelServer-雪花新聞

由此可以知道當一個ASP.NET Core應用程序運行起來時,其內部會有KestrelServer。

那麼為什麼會需要這個KestrelServer?因為它可以做為一個反向代理服務器,幫助ASP.NET Core做到跨平台的需要。

以傳統Windows系統上的IIS為例,如下圖所示,ASP.NET Core應用程序中的代碼已經不再直接依賴於IIS容器,而是通過KestrelServer這個代理將HTTP請求轉換為HttpContext對象,再對此對象進行處理。

.NET Core開發日志——從ASP.NET Core Module到KestrelServer-雪花新聞

圖中的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方法。

.NET Core開發日志——從ASP.NET Core Module到KestrelServer-雪花新聞

在此方法里就有那些核心的處理HTTP請求的操作。

.NET Core開發日志——從ASP.NET Core Module到KestrelServer-雪花新聞

在ASP.NET Core應用程序這端,CreateWebHostBuilder(args).Build().Run();代碼執行之後,會調用其對應的異步方法:

.NET Core開發日志——從ASP.NET Core Module到KestrelServer-雪花新聞

該方法中又調用了WebHost的StartAsync方法:

.NET Core開發日志——從ASP.NET Core Module到KestrelServer-雪花新聞

BuildApplication方法內部從IoC容器取出KestrelServer的實例:

.NET Core開發日志——從ASP.NET Core Module到KestrelServer-雪花新聞

最後調用KestrelServer的StartAsync方法:

.NET Core開發日志——從ASP.NET Core Module到KestrelServer-雪花新聞

到了這一步,KestrelServer終於可以監聽來自ASP.NET Core Module發出的HTTP請求,而ASP.NET Core應用程序也可以開始其自身的任務處理了。

原文地址https://www.cnblogs.com/kenwoo/p/9309264.html