持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第10天,
点击查看活动详情
从
Visual Studio(2022)
创建的
ASP.NET Core
或者使用
SDK(.NET6.0)
创建的应用使用顶级语句。
在
C# 9
之前,程序的入口点为
Main
的静态方法。
static void Main(string[] args)
Console.WriteLine("Hello world");
从 C# 9 开始,无需在控制台应用程序项目中显式包含 Main
方法。
Console.WriteLine("Hello World");
如上是.NET 6 / C# 10 创建项目程序结构的一些变化,不要觉得陌生,个人觉得这也是一大优化点。使用顶级语句功能最大程度地减少必须编写的代码,但是值得注意的有几点:
只能有一个顶级文件:即一个程序只能存在一个入口
顶级语句可以引用 args
变量来访问输入的任何命令行参数(永远不会为 null),但如果未提供任何命令行参数,则其 Length
将为零。
顶级语句的文件还可以包含命名空间和类型定义,但它们必须位于顶级语句之后
可以直接使用await调用异步方法
如果包含 using 指令,则它们必须首先出现在文件中
了解了这些变化之后就让我们一起来探索我们ASP.NET Core是如何启动的,并且启动过程中都做了哪些事情吧。
Program 类
Program.cs
为模板创建.NET Core应用程序的启动代码
WebApplication.CreateBuilder(args)
public static WebApplicationBuilder CreateBuilder(string[] args) =>
new(new() { Args = args });
简单点说就是创建一个WebApplicationBuilder实例
build.Services
主要做的就是将服务添加到 DI
容器中,在创建WebApplicationBuilder实例的时候会添加许多框架提供的服务。
builder.Services.AddControllers();
public static IMvcBuilder AddControllers(this IServiceCollection services)
if (services == null)
throw new ArgumentNullException(nameof(services));
var builder = AddControllersCore(services);
return new MvcBuilder(builder.Services, builder.PartManager);
private static IMvcCoreBuilder AddControllersCore(IServiceCollection services)
var builder = services
.AddMvcCore()
.AddApiExplorer()
.AddAuthorization()
.AddCors()
.AddDataAnnotations()
.AddFormatterMappings();
if (MetadataUpdater.IsSupported)
services.TryAddEnumerable(
ServiceDescriptor.Singleton<IActionDescriptorChangeProvider, HotReloadService>());
return builder;
builder.Build() 这一段源码太长就不一一拉出来看,大家如果感兴趣也可以去研究研究
构造一个 WebApplication 实例。
设置构造主机的配置。
将已经构建的配置提供程序复制到最终的配置生成器,连接应用程序配置。
为构建过程和应用程序的其余部分设置配置。
复制WebApplicationBuilder添加的服务
WebApplicationBuilder.Build 方法使用一组默认选项配置主机,例如:
将 Kestrel 用作 Web 服务器并启用 IIS 集成。
从 appsettings.json
、环境变量、命令行参数和其他配置源中加载配置。
将日志记录输出发送到控制台并调试提供程序。
ASP.NET Core 在应用启动时读取该环境变量,并将该值存储在 IWebHostEnvironment
实现中
if (app.Environment.IsDevelopment())
app.UseSwagger();
app.UseSwaggerUI();
请求处理管道由一系列中间件组件组成,通过调用 Use{Feature}
扩展方法,向管道添加中间件组件
什么是中间件:
中间件是一种装配到应用管道以处理请求和响应的软件。 每个组件:
选择是否将请求传递到管道中的下一个组件。
可在管道中的下一个组件前后执行工作。
至此就是整个ASP.NET Core运行的整个流程,当然这其中也包括了许多ASP.NET Core 应用的基础知识,包括依赖关系注入 (DI)、配置、中间件,要想真正了解,还得多看看源码实现,只有了解了基础你在自己研究框架的时候才能更加的轻松、游刃有余。
文末彩蛋 .NET Core 为什么能跨平台?
CreateBuilder 内部调用了 UseKestrel(IWebHostBuilder),Kestrel 服务器 是默认跨平台 HTTP 服务器实现。 Kestrel 提供了最佳性能和内存利用率,但它没有 HTTP.sys 中的某些高级功能。
本身作为边缘服务器,处理直接来自网络(包括 Internet)的请求。