这是ASP.NET Core新核心对象系列的第二篇,上一篇 WebHost准备阶段 我们讲到了WebHostBuilder的初始化及配置。我们给WebHostBuilder进行以下配置
- UseKestrel 设置Kestrel为HttpServer
- ConfigureAppConfiguration 设置了配置文件
- ConfigureLogging 配置了日志处理器,添加了 Debug和控制台两种方式
- UseStartup 指定了Startup类
有了一个WebHostBuilder之后,我们就可以调用它的Build方法来构建一个WebHost。
我们可以先来看一下Build方法的代码
// 初始化DI
var hostingServices = BuildCommonServices(out var hostingStartupErrors);
var applicationServices = hostingServices.Clone();
var hostingServiceProvider = hostingServices.BuildServiceProvider();
// 构造 WebHost
var host = new WebHost(
applicationServices,
hostingServiceProvider,
_options,
_config,
hostingStartupErrors);
// 初始化host
host.Initialize();
return host;
BuildCommonServices
这是 WebHostBuild方法执行的第一个方法,主要是new ServiceCollection 以及完成了以下几个基础实例的注册:
- IApplicationBuilderFactory
- IHttpContextFactory
- IMiddlewareFactory
- IStartupFilter
- IServiceProviderFactory<IServiceCollection>
- IStartup
其实将IStartup注册到 DI,利用了两种方式 。如果我们在WebHostBuilder中指定的 Startup.cs继承自 IStartup接口,则直接绑定到IStartup。
if (typeof(IStartup).GetTypeInfo()
.IsAssignableFrom(startupType.GetTypeInfo()))
{
services.AddSingleton(typeof(IStartup), startupType);
}
否则,需要 按照命名规则来构造一个Startup。
services.AddSingleton(typeof(IStartup), sp =>
{
var hostingEnvironment =
sp.GetRequiredService<IHostingEnvironment>();
var methods = StartupLoader.LoadMethods(
sp,
startupType,
hostingEnvironment.EnvironmentName);
return new ConventionBasedStartup(methods);
});
Host的初始化
Host的初始化是我们这次要讲的重点,因为它完成了整个Http管道的构建。
if (_application == null)
{
_application = BuildApplication();
}
这个_application即是一个RequestDelegate。参数为一个HttpContext。
public delegate Task RequestDelegate(HttpContext context);
我们来看一下BuildApplication方法有7步,后面的五步总结起来是构造IAapplicationBuilder并用Startup.cs的Configure方法构造一个我们上面讲的这个RequestDeleaget。
IApplicationBuilder
IApplicationBuilder定义在HttpAbstractions这个项目里面,HttpAbstractions是ASP.NET Core在 Githab上的一个子项目,也是ASP.NET Core的重要组成部分,它定义了很多ASP.NET Core中关于HTTP处理整个过程中的行为。 IApplicationBuilder就算一个。
它主要包括以几个重要的属性:
我们在Startup.cs中看到的Configure方法给的参数就是这个IApplicationBuilder,而这个方法是用来添加Middleware的。
public void Configure(IApplicationBuilder app) {
// 相当于 List<Middleware>().add(某个middleware)
app.Use(某个Middleware)
}
WebHost.Start
在我们的WebHost初始化完成之后,它的Start方法会被调用来启动IServer的端口监听,并开始处理Http请求。这是WebHost的第三阶段:启动过程 。我们将在周四晚上8点的下一篇中详细讲述。
<div class="section section-blog-info">
<div class="row">
<div class="col-md-6">
<div class="entry-categories">分类: <span class="label label-primary"><a href="http://www.jessetalk.cn/category/tech/">技术随笔</a></span> </div>
<div class="entry-tags">标签:<span class="entry-tag"><a href="http://www.jessetalk.cn/tag/asp-net-core/" rel="tag">asp.net core</a></span></div> </div>
<div class="col-md-6">
<div class="entry-social">
<a target="_blank" rel="tooltip" data-original-title="分享到 Facebook" class="btn btn-just-icon btn-round btn-facebook" href="https://www.facebook.com/sharer.php?u=http://www.jessetalk.cn/2017/11/14/aspnet-core-object-webhost-build/">
<i class="fa fa-facebook"></i>
</a>
<a target="_blank" rel="tooltip" data-original-title="分享至微博" class="btn btn-just-icon btn-round btn-twitter" href="http://twitter.com/share?url=http://www.jessetalk.cn/2017/11/14/aspnet-core-object-webhost-build/&text=%E6%88%91%E5%BF%83%E4%B8%AD%E7%9A%84ASP.NET%20Core%20%E6%96%B0%E6%A0%B8%E5%BF%83%E5%AF%B9%E8%B1%A1WebHost%EF%BC%88%E4%BA%8C%EF%BC%89">
<i class="fa fa-twitter"></i>
</a>
<a rel="tooltip" data-original-title=" Share on Email" class="btn btn-just-icon btn-round" href="mailto:?subject=我心中的ASP.NET%20Core%20新核心对象WebHost(二)&body=http://www.jessetalk.cn/2017/11/14/aspnet-core-object-webhost-build/">
<i class="fa fa-envelope"></i>
</a>
</div>
</div> </div>
<hr>
1 条评论
Allen · 2018年2月27日 下午2:59
能不能再加几个图呢?比如顺序流程图,帮助新手理解,文章讲的很好,总结的也很棒,感谢