當前位置:
首頁 > 知識 > 一張圖理清ASP.NET Core啟動流程

一張圖理清ASP.NET Core啟動流程

一張圖理清ASP.NET Core啟動流程

對於ASP.NET
Core應用程序來說,我們要記住非常重要的一點是:其本質上是一個獨立的控制台應用,它並不是必需在IIS內部託管且並不需要IIS來啟動運行(而這正是ASP.NET
Core跨平台的基石)。ASP.NET Core應用程序擁有一個內置的Self-Hosted(自託管)的Web
Server(Web伺服器),用來處理外部請求。

不管是託管還是自託管,都離不開Host(宿主)。在ASP.NET
Core應用中通過配置並啟動一個Host來完成應用程序的啟動和其生命周期的管理(如下圖所示)。而Host的主要的職責就是Web
Server的配置和Pilpeline(請求處理管道)的構建。

一張圖理清ASP.NET Core啟動流程

這張圖描述了一個總體的啟動流程,從上圖中我們知道ASP.NET Core應用程序的啟動主要包含三個步驟:

1.CreateDefaultBuilder():創建IWebHostBuilder

2.Build():IWebHostBuilder負責創建IWebHost

3.Run():啟動IWebHost

所以,ASP.NET Core應用的啟動本質上是啟動作為宿主的WebHost對象。

其主要涉及到兩個關鍵對象IWebHostBuilder和IWebHost,它們的內部實現是ASP.NET
Core應用的核心所在。下面我們就結合源碼並梳理調用堆棧來一探究竟。


2. 宿主構造器:IWebHostBuilder

在啟動IWebHost宿主之前,我們需要完成對IWebHost的創建和配置。而這一項工作需要藉助IWebHostBuilder對象來完成的,ASP.NET
Core中提供了默認實現WebHostBuilder。而WebHostBuilder是由WebHost的同名工具類(Microsoft.AspNetCore命名空間下)中的CreateDefaultBuilder方法創建的。

一張圖理清ASP.NET Core啟動流程

從上圖中我們可以看出CreateDefaultBuilder()方法主要幹了六件大事:

1.UseKestrel:使用Kestrel作為Web server。

2.UseContentRoot:指定Web host使用的content root(內容根目錄),比如Views。默認為當前應用程序根目錄。

3.ConfigureAppConfiguration:設置當前應用程序配置。主要是讀取 appsettinggs.json
配置文件、開發環境中配置的UserSecrets、添加環境變數和命令行參數 。

4.ConfigureLogging:讀取配置文件中的Logging節點,配置日誌系統。

5.UseIISIntegration:使用IISIntegration 中間件。

6.UseDefaultServiceProvider:設置默認的依賴注入容器。

創建完畢WebHostBuilder後,通過調用UseStartup()來指定啟動類,來為後續服務的註冊及中間件的註冊提供入口。


3. 宿主:IWebHost

在ASP.Net
Core中定義了IWebHost用來表示Web應用的宿主,並提供了一個默認實現WebHost。宿主的創建是通過調用IWebHostBuilder的Build()方法來完成的。那該方法主要做了哪些事情呢,我們來看下面這張【ASP.NET
Core啟動流程調用堆棧】中的黃色邊框部分:

一張圖理清ASP.NET Core啟動流程

其核心主要在於WebHost的創建,又可以劃分為三個部分:

  1. 構建依賴注入容器,初始通用服務的註冊:BuildCommonService();

  2. 實例化WebHost:var host = new WebHost(...);

  3. 初始化WebHost,也就是構建由中間件組成的請求處理管道:host.Initialize();

3.1. 註冊初始通用服務

BuildBuildCommonService方法主要做了兩件事:

1.查找HostingStartupAttribute特性以應用其他程序集中的啟動配置

2.註冊通用服務

3.若配置了啟動程序集,則發現並以IStartup類型注入到IOC容器中

3.2. 創建IWebHost

public IWebHost Build(){ //省略部分代碼
var host = new WebHost(
applicationServices,
hostingServiceProvider,
_options,
_config,
hostingStartupErrors);
}
host.Initialize(); return host;
}

3.3. 構建請求處理管道

請求管道的構建,主要是中間件之間的銜接處理。

而請求處理管道的構建,又包含三個主要部分:

1.註冊Startup中綁定的服務;

2.配置IServer;

3.構建管道

請求管道的構建主要是藉助於IApplicationBuilder,相關類圖如下

一張圖理清ASP.NET Core啟動流程


4. 啟動WebHost

WebHost的啟動主要分為兩步:

1.再次確認請求管道正確創建

2.啟動Server以監聽請求

3.啟動 HostedService

一張圖理清ASP.NET Core啟動流程


4.1. 確認請求管道的創建

從圖中可以看出,第一步調用Initialize()方法主要是取保請求管道的正確創建。其內部主要是對BuildApplication()方法的調用,與我們上面所講WebHost的構建環節具有相同的調用堆棧。而最終返回的正是由中間件銜接而成的RequestDelegate類型代表的請求管道。

4.2. 啟動Server

我們先來看下類圖:

一張圖理清ASP.NET Core啟動流程

從類圖中我們可以看出IServer介面主要定義了一個只讀的特性集合屬性、一個啟動和停止的方法聲明。在創建宿主構造器IWebHostBuilder時我們通過調用UseKestrel()方法指定了使用KestrelServer作為默認的IServer實現。其方法申明中接收了一個IHttpApplicationapplication的參數,從命名來看,它代表一個Http應用程序,我們來看下具體的介面定義:

一張圖理清ASP.NET Core啟動流程

其主要定義了三個方法,第一個方法用來創建請求上下文;第二個方法用來處理請求;第三個方法用來釋放上下文。而至於請求上下文,是用來攜帶請求和返迴響應的核心參數,其貫穿與整個請求處理管道之中。ASP.NET
Core中提供了默認的實現HostingApplication,其構造函數接收一個RequestDelegate
_application(也就是鏈接中間件形成的處理管道)用來處理請求。

一張圖理清ASP.NET Core啟動流程


4.3. 啟動IHostedService

IHostedService介面用來定義後台任務,通過實現該介面並註冊到Ioc容器中,它會隨著ASP.NET Core
程序啟動而啟動,終止而終止。


5. 總結

結合源碼,通過對ASP.NET Core運行調用堆棧的梳理,其啟動流程的總體脈絡一目了然,並且了解到主要的幾個關鍵對象:

負責創建IWebHost的宿主構造器IWebHostBuilder

代表宿主的IWebHost介面

用於構建請求管道的IApplicationBuilder

中間件銜接而成的RequestDelegate

代表Web Server的IServer介面

貫穿請求處理管道的請求上下文HttpContext

可以用來註冊後台服務的IHostedService介面

這一節就先從總體上對ASP.NET Core的運行原理有個基本的認識,後續我們再一一講解這幾個核心對象來加深理解。

(轉自博客園 作者:『聖傑』出處:http://www.cnblogs.com/sheng-jie/)



· 2017年【中公教育】特別推出2017年就業促進計劃,500萬就業基金助你成為IT達人

詳情請戳http://www.ujiuye.com/zt/jycj/?wt.bd=bgz

· 什麼?海量IT學習資料白給你都不要?別想了,加群搶:584539956

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 IT優就業 的精彩文章:

SQL Server 後悔葯 delete drop update
最好用的css輔助工具——SASS&LESS

TAG:IT優就業 |