Program.cs 和 Startup.cs 各自作用及启动顺序 -- ASP.NET Core 3 随笔【2】

我们在VS2019新建一个空的API项目,会发现在ASP.NET Core环境下,项目变的更加简单明了,而且比之前多了几个不一样的东西,如下图:

 

Program.cs 这个以前我们只有在控制台程序才会发现的东西,为什么会出现在这里?我分明创建的是一个API的Web程序啊。

这里就涉及到一个很重要的东西:每一个ASP.NET Core 应用程序,从本质上来说,都是一个独立的控制台应用,并不需要依托IIS来运行,这也是它能实现跨平台的一个基础。

 

一、Program.cs  -- 创建并运行WebHost实例,调用Startup类

 1     public class Program
 2     {
 3         public static void Main(string[] args)
 4         {
 5             CreateHostBuilder(args).Build().Run();
 6         }
 7 
 8         public static IHostBuilder CreateHostBuilder(string[] args) =>
 9             Host.CreateDefaultBuilder(args)
10                 .ConfigureWebHostDefaults(webBuilder =>
11                 {
12                     webBuilder.UseStartup<Startup>();
13                 });
14     }

在Main方法里面

CreateHostBuilder(args)  -- 创建一个 IHostBuilder 对象

.CreateDefaultBuilder

这个里面做的事情包括

  • 将内容根目录设置为由 GetCurrentDirectory 返回的路径。
  • 通过以下项加载主机配置:
    • 前缀为 DOTNET_ 的环境变量。
    • 命令行参数。
  • 通过以下对象加载应用配置:
    • appsettings.json 。
    • appsettings.{Environment}.json 。
    • 密钥管理器 当应用在 Development 环境中运行时。
    • 环境变量。
    • 命令行参数。
  • 添加以下日志记录提供程序:
    • 控制台
    • 调试
    • EventSource
    • EventLog(仅当在 Windows 上运行时)
  • 当环境为“开发”时,启用范围验证和依赖关系验证。

.ConfigureWebHostDefaults

这个里面做的事情包括:

  • 从前缀为 ASPNETCORE_ 的环境变量加载主机配置。
  • 使用应用的托管配置提供程序将 Kestrel 服务器设置为 web 服务器并对其进行配置。 
  • 添加主机筛选中间件。
  • 如果 ASPNETCORE_FORWARDEDHEADERS_ENABLED 等于 true,则添加转接头中间件。
  • 支持 IIS 集成。 

 

Build() :创建IHost

 

Run():启动运行IHost

 

二、Startup.cs 

Startup 类配置服务和应用的请求管道。

 1     public class Startup
 2     {
 3         public Startup(IConfiguration configuration)
 4         {
 5             Configuration = configuration;
 6         }
 7 
 8         public IConfiguration Configuration { get; }
 9 
10         // This method gets called by the runtime. Use this method to add services to the container.
11         public void ConfigureServices(IServiceCollection services)
12         {
13             services.AddControllers();
14         }
15 
16         // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
17         public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
18         {
19             if (env.IsDevelopment())
20             {
21                 app.UseDeveloperExceptionPage();
22             }
23 
24             app.UseHttpsRedirection();
25 
26             app.UseRouting();
27 
28             app.UseAuthorization();
29 
30             app.UseEndpoints(endpoints =>
31             {
32                 endpoints.MapControllers();
33             });
34         }
35     }

 

 

ConfigureServices :  将服务注入到IServiceCollection服务容器中

  • 在 Configure 方法配置应用服务之前,由主机调用。
  • 其中按常规设置配置选项。

 

Configure :指定应用响应 HTTP 请求的方式

Configure 方法用于指定应用响应 HTTP 请求的方式。 可通过将中间件组件添加到 IApplicationBuilder 实例来配置请求管道。 IApplicationBuilder 方法可使用 Configure,但未在服务容器中注册。 托管创建 IApplicationBuilder 并将其直接传递到 Configure

ASP.NET Core 模板配置的管道支持:

  • 开发人员异常页
  • 异常处理程序
  • HTTP 严格传输安全性 (HSTS)
  • HTTPS 重定向
  • 静态文件
  • ASP.NET Core MVC 和 Razor Pages

 

三、启动顺序

Program.cs 里面的Main方法最先启动,然后会调用Startup类,Startup类里面先调用 ConfigureServices 方法 ,再调用 Configure  方法。

 

posted @ 2020-04-28 17:12  不爱啰嗦的胜哥  阅读(2479)  评论(0编辑  收藏  举报