前言
一个Asp.NetCore项目,知道大概的启动流程是有必要的,比如后续遇见配置信息覆盖等相关问题时也大概知道是什么原因,了解原因之后,再去搜索引擎找答案,否则目标不明确,茫茫人海怎么会一下找到自己想要的,除非是“偶遇”;“偶遇”太难,一起浅析一个Asp.NetCore 项目的启动流程;
正文
先创建一个WebAPI项目,用的是.NetCore3.1,后续的项目例子都统一用.NetCore3.1,除非特殊说明;项目如下:
如上图所示,一个WebAPI项目启动方式本质也是一个控制台程序,程序入口都是从Main函数开始,就从里面方法看看大概都做了什么,其中择取几个方法源码简要说明主要功能,通过增加代码注释的方式(我觉得这样比较方便对应浏览),完整源代码从以下两个地址获取,通过Everything查找工具比较方便查询代码:
主项目地址: https:// github.com/dotnet/aspne tcore/tree/v3.1.0
扩展项目地址: https:// github.com/dotnet/exten sions/releases/tag/v3.1.6
1. Host.CreateDefaultBuilder方法
public
2. ConfigureWebHostDefaults 方法
public
2.1 WebHost.ConfigureWebDefaults方法
internal
3. Build方法,其实这个方法就是根据之前配置构造出一个IHost对象
public
4. Run()方法,开启服务器,之后就可以进行请求了
综上几个关键方法,从其中Host这个关键词出现很多次,其实在http://Asp.Net Core应用中是通过配置并启动一个Host来完成应用程序的启动和生命周期的管理。而Host主要就是对Web Server的配置和请求处理管理的管理,简要流程如下图:
在整个启动流程中,返回的IHostBuilder中暴露配置和注入的相关接口,可用于自己定义扩展,接下来通过打印的方式来看看一下几个暴露方法的执行顺序,其实以上Build方法的时候已经明确了对应方法的顺序;
改造代码如下:
Startup方法中的三个方法也增加对应的打印,运行如下:
如上图,除了Startup中的ConfigureServices会跟随ConfigureWebHostDefaults改变以外,其他方法顺序都是固定。那这些方法主要作用都是什么呢?如下图:
图中Program.ConfigureServices和Startup.ConfigureServices的执行顺序会根据ConfigureWebHostDefaults的位置改变会交替变动;
总结
以上内容只是提取了其中比较关键的流程进行说明,并没有详细解析源代码,这里只是先浅析,后续再继续一起深究源代码;下一节说说依赖注入;