您的位置:首页 > 编程语言 > ASP

Asp.Net.Core 系列-中间件和依赖注入Hosting篇

2017-08-10 17:00 901 查看
本文讲解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)处理它。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: