前言
微软在今年9月份发布了NET Core 3.0,增加如下的重大改进:
- 使用.NET Core可以开发Windows桌面应用,支持对Winform和WPF(可打包单个应用)
- 基于span和UTF-8完全重写了JSON APIs,不在依赖于Json.NET
- 支持在 树莓派 和 ARM 芯片中进行loT开发
- 垃圾回收采用更少的内存
同时,也发布了 ASP.NET Core 3.0 和 EF Core 3.0 ,本篇文章主要介绍 ASP.NET Core 3.0 中项目的生命周期,并会简述与 ASP.NET Core 2.x 相比的差异性。
请求解析
首先简单了解下ASP.NET Core解析一个HTTP请求的过程,如下图所示:
图片来之ASP.NET CORE in Action
- 发起一个HTTP请求
- 请求通过IIS或者Nginx或者Apache到你的ASP.NET Core应用
- ASP.NET Core Web服务接收这个HTTP请求,将它交给middleware
- middleware处理该请求,并将它交给MVC middleware
- MVC middleware生成一个HTML响应
- 响应通过middleware返回到Web服务
- HTTP响应返回到用户的浏览器
程序入口
在ASP.NET Core中,将Program.cs文件的Main()方法作为应用的入口(这点和Console项目、Winform项目是一致的),当你启动你的web应用时这个方法必须存在。在ASP.NET Core 3.0应用中,它被 创建 和 运行 一个IHostBuilder实例,如下面的代码所示:
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.UseStartup<Startup>();
});
}
【注意】
- .NET Core 2.x的Program.cs是创建一个IWebHost,而3.0创建的是一个IHostBuilder
- .NET Core 2.x的IWebHost的命名空间是Microsoft.AspNetCore.Hosting,而3.0的IHostBuilder命名空间是Microsoft.Extensions.Hosting
CreateHostBuilder()介绍
- 从环境变量中加载“DOTNET_”前缀的配置
- 从命令行参数中加载配置
- 从“appsetting.json”和“appsettings.[ 环境名 ].json”加载配置
- 如果 [ 环境名 ] 时“Development”时从用户机密(User Secrets)加载配置
- 从环境变量加载配置
- 配置ILoggerFactory记录日志
- 当 [ 环境名 ] 为“Development”时在依赖注入容器中启用范围验证(scope validation)
具体内容可以查看相关源码或参考Host.CreateDefaultBuilder()方法
//Microsoft.Extensions.Hosting.Host.CreateDefaultBuilder()
public static IHostBuilder CreateDefaultBuilder(string[] args)
{
HostBuilder hostBuilder = new HostBuilder();
hostBuilder.UseContentRoot(Directory.GetCurrentDirectory());
hostBuilder.ConfigureHostConfiguration(delegate (IConfigurationBuilder config) {
config.AddEnvironmentVariables("DOTNET_");</