日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

一张图理清ASP.NET Core启动流程

發布時間:2023/12/4 asp.net 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一张图理清ASP.NET Core启动流程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 引言

對于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應用程序的啟動主要包含三個步驟:

  • CreateDefaultBuilder():創建IWebHostBuilder

  • Build():IWebHostBuilder負責創建IWebHost

  • 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方法創建的。

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

  • UseKestrel:使用Kestrel作為Web server。

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

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

  • ConfigureLogging:讀取配置文件中的Logging節點,配置日志系統。

  • UseIISIntegration:使用IISIntegration 中間件。

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

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

    3. 宿主:IWebHost

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

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

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

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

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

  • 3.1. 注冊初始通用服務

    BuildBuildCommonService方法主要做了兩件事:

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

  • 注冊通用服務

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

  • 3.2. 創建IWebHost

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

    3.3. 構建請求處理管道

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

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

  • 注冊Startup中綁定的服務;

  • 配置IServer;

  • 構建管道

  • 請求管道的構建主要是借助于IApplicationBuilder,相關類圖如下:

    4. 啟動WebHost

    WebHost的啟動主要分為兩步:

  • 再次確認請求管道正確創建

  • 啟動Server以監聽請求

  • 啟動 HostedService

  • 4.1. 確認請求管道的創建

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

    4.2. 啟動Server

    我們先來看下類圖:

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

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

    var httpContextFactory = _applicationServices.GetRequiredService<IHttpContextFactory>();var hostingApp = new HostingApplication(_application, _logger, diagnosticSource, httpContextFactory);

    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/p/7640163.html?


    .NET社區新聞,深度好文,微信中搜索dotNET跨平臺或掃描二維碼關注

    總結

    以上是生活随笔為你收集整理的一张图理清ASP.NET Core启动流程的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。