.Net Core Host 之詳解


簡介:

開發使用有三年經驗了,想趁這個機會把net core的知識點梳理一下,也更好的研究一下.NET 5給我們帶來的變化。

主機的概念:

一個主機是封裝了應用程序的資源,比如一個對象:

  • 依賴注入 (DI)
  • 日志記錄
  • 配置
  • IHostedService 實現

將應用程序的所有相互依賴的資源包含在一個對象中的主要原因是生命周期管理:控制應用程序啟動和正常關閉。

 

主機的創建

主機通常由Program類中的代碼配置、構建和運行。該Main方法:

  • 調用CreateHostBuilder方法來創建和配置構建器對象。
  • 構建器對象上的調用Build和Run方法.

1. Host.CreateDefaultBuilder(args) 主要做了以下幾件事:

  • 內容根設置為GetCurrentDirectory返回的路徑
  • 從以下位置加載主機配置:
    • DOTNET_.為前綴的環境變量
    • 命令行參數。
  • 從以下位置加載應用程序配置:
    • appsettings.json
    • appsettings.{Environment}.json
    • 應用程序在Development環境中運行時的用戶機密
    • 環境變量。
    • 命令行參數。
  • 添加以下日志記錄提供程序:
    • 安慰
    • 調試
    • 事件源
    • EventLog(僅當在 Windows 上運行時)
  • 當環境為 Development 時啟用范圍驗證依賴項驗證

2. 對於http 工作負載,使用ConfigureWebHostDefaults 去實例化一個IWebHostBuilder並且向webbuilder增加功能配置。

public static IHostBuilder ConfigureWebHostDefaults(this IHostBuilder builder, 

Action<IWebHostBuilder> configure)
{
            if (configure is null)
            {
                throw new ArgumentNullException(nameof(configure));
            }

            return builder.ConfigureWebHost(webHostBuilder =>
            {
                WebHost.ConfigureWebDefaults(webHostBuilder);

                configure(webHostBuilder);
            });
}

可以看到,ConfigureWebHostDefaults 是一個擴展方法,在內部調用 ConfigureWebHost 這個擴展方法,

ConfigureWebHost 這個擴展方法又做了哪些事情? 代碼鏈接:https://github.com/dotnet/aspnetcore/blob/main/src/Hosting/Hosting/src/GenericHostWebHostBuilderExtensions.cs

 

public static class GenericHostWebHostBuilderExtensions
    {
        /// <summary>
        /// Adds and configures an ASP.NET Core web application.
        /// </summary>
        public static IHostBuilder ConfigureWebHost(this IHostBuilder builder, Action<IWebHostBuilder> configure)
        {
            if (configure is null)
            {
                throw new ArgumentNullException(nameof(configure));
            }

            return builder.ConfigureWebHost(configure, _ => { });
        }

        /// <summary>
        /// Adds and configures an ASP.NET Core web application.
        /// </summary>
        public static IHostBuilder ConfigureWebHost(this IHostBuilder builder, Action<IWebHostBuilder> configure, Action<WebHostBuilderOptions> configureWebHostBuilder)
        {
            if (configure is null)
            {
                throw new ArgumentNullException(nameof(configure));
            }

            if (configureWebHostBuilder is null)
            {
                throw new ArgumentNullException(nameof(configureWebHostBuilder));
            }

            var webHostBuilderOptions = new WebHostBuilderOptions();
            configureWebHostBuilder(webHostBuilderOptions);
            var webhostBuilder = new GenericWebHostBuilder(builder, webHostBuilderOptions);
            configure(webhostBuilder);
            builder.ConfigureServices((context, services) => services.AddHostedService<GenericWebHostService>());
            return builder;
        }
    }

通過實例化一個 GenericWebHostBuilder 實例,擴展HostBuilder ASP.NET Core的運行時配置。

ConfigureWebHost 中的confiure 其實執行的是: 

 WebHost.ConfigureWebDefaults(webHostBuilder);

 configure(webHostBuilder); (2)

(2) 執行的是我們在program 代碼里進行的設置。例如 webBuilder.UseStartup<Startup>()。

有讀者比較感興趣 GenericWebHostBuilder 這個類具體都做了什么,因為內容較多,不放在這里展示,實例化后的 WebHostBuilder 內部擁有 HostBuilder,並且為其擴展了各種web 運行時的配置;

最后,回到 WebHost.ConfigureWebDefaults(webHostBuilder) ,它為注入的 webHostBuilder啟用各類配置:

  • 從前綴為 的環境變量加載主機配置ASPNETCORE_
  • Kestrel服務器設置為 Web 服務器並使用應用的托管配置提供程序對其進行配置。
  • 添加主機過濾中間件
  • 如果等於,添加轉發頭中間件ASPNETCORE_FORWARDEDHEADERS_ENABLEDtrue
  • 啟用 IIS 集成。

3. 主機的build

通過 CreateHostBuilder(args).Build() 去構建主機。

這其中主要是:

  • 構建配置系統
  • 構建主機環境信息
  • 構建主機build 上下文
  • 構建應用程序配置
  • 創建依賴注入提供程序,依賴注入容器

總而言之:(如果你忽略上面的一整段,此處要看)

(1) 創建了HostBuilder -> (2) 為hostbuilder添加 aspnet core運行時的配置 -> (3) 啟用各類web 運行時需要的配置 -> (4) 根據加載好的各種配置構建主機運行時需要提供的服務(configuration, DI Container, 應用程序配置等) 

 

會持續整理發布關於后端和NET Core, .NET 的相關學習和認知,歡迎大家一起討論學習。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM