本文讲解Microsoft.AspNetCore.Hosting的知识点
先看一下,.Net.Core哪些地方用到了?
在Program.cs中的
var host = new WebHostBuilder().UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseStartup<Startup>()
.UseApplicationInsights()
.Build();
host.Run();
第一眼看到的就是WebHostBuilder类实例化,那么一切都清楚了,实例化了一个WebHostBuilder去承载服务和路径等等,那么也就知道了使用UserXXXX(),我们右键查看,就会看到这些都是Microsoft.AspNetCore.Hosting的扩展。当然我们也可以使用ConfigureServices来承载,当然我们查看查看源代码UseXXXX()实际也是调用了ConfigureServices来承载。
如何理解承载?
.NET平台的核心技术为:通用语言运行时(CLR:Common Language Runtiome),那么web程序就是承载在CLR上面。当然我们可以读一读《CLR via C#》这本书。
它可以为自己加载合适的CLR来运行Web应用,这就是承载。
先看看Program.cs中有哪些承载,UseKestrel承载核心懂Linux很好理解,这个就是运行CLR上面,UseContentRoot承载路径,UseIISIntegration承载IIS就这是我们可以把部署到windows上面的基础,UseStartup承载了一个StartUp类,这个类里面有中间件和服务等等,UseApplicationInsights承载应用程序,Build添加服务了,依赖注入到服务器了。host.Run();这就是运行了。
现在我们可以根据上面的说法,看一下源代码来了解承载吧。
微软定义了IWebHostBuilder接口来写承载,WebHostBuilder就继承了IWebHostBuilder接口。附上源代码文件链接(https://github.com/aspnet/Hosting):
我们先看实例化:
看源代码我们可以看到委托,承载的环境,一些基本配置。
WebHostDefaults的配置就是把当前环境的一些信息,承载到了CLR上面了。
接着看:
public IWebHostBuilder ConfigureServices(Action<IServiceCollection> configureServices){}
这个我们一看就很熟悉吧,这就是我们承载服务的方法,就是把我们写的功能承载到了_configureServicesDelegates委托中。
public IWebHost Build(){}
这个才是我们今天要看明白的地方。其中BuildCommonServices就是服务以委托的形式存在,将配置的服务放入到ServiceCollection,还有加入其它服务。这里面内容很多,就是构造了一个服务委托链,说白了就是生成了一个个管道。
接着看:host.Run();
调用了Server.Start()方法,
它的作用就是配合Server去创建上下文,大概的过程就是
- 服务器把请求的信息放入一个IFeatureCollection的变量里面;
- 利用上面的信息构造上下文;
- 调用ProcessRequestAsync()方法处理请求,此时请求进入处理管道(Pipeline)。
总结一下:
- 首先使用WebHostBuildler注册基本信息,比如用哪个服务器?根目录是哪个?StartUp的元数据等等;
- 在WebHost = WebHostBuildler.Build()过程中,添加大量基本服务+StartUp.ConfigureServices()方法中的服务;
- 在WebHost.Initialize()方法中,利用StartUp.Configure()方法中使用的服务+一些默认使用的服务组建请求管道,并存储在_application字段中;
- 使用_application构造一个HostingApplication,并传入WebHost.Run()->WebHost.Start()->Server.Start()方法;
- Server使用HostingApplication来构造HttpContext,并使用请求管线(Pipeline)处理它。