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 方法。