Asp.Net Core 3.1+ 啓動過程

Net Core 啓動過程

新建一個新的 Core3.1 項目(注意,不要創建 Net 6.x);

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                Console.WriteLine("ConfigureWebHostDefaults");
                webBuilder.UseStartup<Startup>();
            });
}

CreateHostBuilder 方法返回 IHostBuilder 類型,看看這個類型裏面有什麼:
image
有 6 個方法,我們需要關注的是橙色圈出來的那 3 個;
他們的執行順序是怎樣的?
我們修改 Program.cs 如下,同樣,將 console輸出 添加到 Startup.cs 中:

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration(config =>
            {
                Console.WriteLine("ConfigureAppConfiguration");     // 3
            })
            .ConfigureHostConfiguration(build =>
            {
                Console.WriteLine("ConfigureHostConfiguration");        // 2
            })
            .ConfigureServices(services =>
            {
                Console.WriteLine("ConfigureServices");     // 4
            })
            .ConfigureWebHostDefaults(webBuilder =>
            {
                Console.WriteLine("ConfigureWebHostDefaults");      // 1
                webBuilder.UseStartup<Startup>();
            });
}
public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Console.WriteLine("ctor Startup");
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        Console.WriteLine("Startup.ConfigureServices");
        services.AddControllers();
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        Console.WriteLine("Startup.Configure");
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseHttpsRedirection();

        app.UseRouting();

        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
        });
    }
}

運行輸出:
image
其實,Net Core 在運行中,其執行順序如下圖所示:
image

  • ConfigureWebHostDefaults:註冊我們應用程序必要的幾個組件(如:配置組件、容器組件等)
  • ConfigureHostConfiguration:配置我們應用程序啓動時必要的配置(如:監聽的端口、監聽URL地址,同樣也能嵌入我們自己的配置內容注入到我們的配置框架裏面去)
  • ConfigureAppConfiguration:嵌入我們自己的配置文件供應用程序來讀取,這些配置文件將來就會在後續的應用程序執行過程中間每個組件讀取;
  • 下一組:它們都是用來往容器裏面注入我們的應用的組件
  • 最後一個:用來注入我們的中間件,處理HttpContext整個請求過程的;

Starup.cs 類文件不是必要的

我們可以將 Starup 裏面的內容放到 Programs.cs 中去,項目也能正常運行,如下:

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System;

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.ConfigureServices(services =>
                {
                    Console.WriteLine("Startup.ConfigureServices");     // 6
                    services.AddControllers();
                });

                webBuilder.Configure(app =>
                {
                    Console.WriteLine("Startup.Configure");         // 7

                    app.UseHttpsRedirection();

                    app.UseRouting();

                    app.UseAuthorization();

                    app.UseEndpoints(endpoints =>
                    {
                        endpoints.MapControllers();
                    });
                });
                Console.WriteLine("ConfigureWebHostDefaults");      // 1
                //webBuilder.UseStartup<Startup>();
            });
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章