这是ASP.NET Core新核心对象系列的第二篇,上一篇 WebHost准备阶段 我们讲到了WebHostBuilder的初始化及配置。我们给WebHostBuilder进行以下配置

  1. UseKestrel 设置Kestrel为HttpServer
  2. ConfigureAppConfiguration 设置了配置文件
  3. ConfigureLogging 配置了日志处理器,添加了 Debug和控制台两种方式
  4. 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)

}

它决定了我们的一个请求会经历哪些步骤最终返回给客户端。但是它的生命很短暂,毕竟它只是个Builder,在它完成管道的构建之后,它就生命就结束了。构建管理的过程很简单:
  • 从DI中获取IApplicationBuilderFactory 实例 builderFactory
  • builderFactory.CreateBuilder() 得到 ApplicationBuilder
  • 获取IStartupFilter实例
  • 调用IStartupFilter实例的Configure方法,传处第二步得到的ApplicationBuilder
  • 调用 ApplicationBuilder的Builder方法,也就是我们上面讲的,把所有注册的Middleware串起来最后返回一个RequestDelegate

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/&amp;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(二)&amp;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

能不能再加几个图呢?比如顺序流程图,帮助新手理解,文章讲的很好,总结的也很棒,感谢

发表评论 取消回复

电子邮件地址不会被公开。 必填项已用*标注

名称 *

电子邮件 *

网站

在想些什么?

我心中的ASP.NET Core 新核心对象WebHost(二)的更多相关文章

  1. 我心中的ASP.NET Core 新核心对象WebHost(一)

    以本系列文章向Fish 前辈的那篇我心中的ASP.NET 核心对象致敬.(虽然不知道前辈现在在干什么).一晃就6年过去了,那首 郝云 的<回到那一天>怎么唱来着? 时光一晃,你就三十了. ...

  2. ASP.NET Core 新核心对象WebHost(一)

    以本系列文章向Fish 前辈的那篇我心中的ASP.NET 核心对象致敬.(虽然不知道前辈现在在干什么).一晃就6年过去了,那首 郝云 的<回到那一天>怎么唱来着? 时光一晃,你就三十了. ...

  3. ASP.NET Core中使用IOC三部曲(二.采用Autofac来替换IOC容器,并实现属性注入)

    前言 本文主要是详解一下在ASP.NET Core中,自带的IOC容器相关的使用方式和注入类型的生命周期. 这里就不详细的赘述IOC是什么 以及DI是什么了.. emm..不懂的可以自行百度. 目录 ...

  4. ASP.NET Core 基于JWT的认证(二)

    ASP.NET Core 基于JWT的认证(二) 上一节我们对 Jwt 的一些基础知识进行了一个简单的介绍,这一节我们将详细的讲解,本次我们将详细的介绍一下 Jwt在 .Net Core 上的实际运用 ...

  5. asp.net core新特性(1):TagHelper

    进步,才是人应该有的现象.-- 雨果 今天开始,我就来说说asp.net core的新特性,今天就说说TagHelper标签助手.虽然学习.net,最有帮助的就是microsoft的官方说明文档了,里 ...

  6. ASP.NET Core 之 Identity 入门(二)

    前言 在 上篇文章 中讲了关于 Identity 需要了解的单词以及相对应的几个知识点,并且知道了Identity处在整个登入流程中的位置,本篇主要是在 .NET 整个认证系统中比较重要的一个环节,就 ...

  7. [转]ASP.NET Core 之 Identity 入门(二)

    本文转自:http://www.cnblogs.com/savorboard/p/aspnetcore-identity2.html 前言 在 上篇文章 中讲了关于 Identity 需要了解的单词以 ...

  8. ASP.NET Core框架深度学习(二) 管道对象

    4.HttpContext 第一个对象 我们的ASP.NET Core Mini由7个核心对象构建而成.第一个就是大家非常熟悉的HttpContext对象,它可以说是ASP.NET Core应用开发中 ...

  9. 学习ASP.NET Core Razor 编程系列十二——在页面中增加校验

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

随机推荐

  1. NLP 中 Attention Model 解析

    Attention Model,简称AM模型,本文只谈文本领域的AM模型,其实图片领域AM的机制也是相同的. 目前绝大多数文献中出现的AM模型是附着在Encoder-Decoder框架下的,但是其实A ...

  2. 线程数设置和CPU数的关系

    一般说来,大家认为线程池的大小经验值应该这样设置:(其中N为CPU的个数) 如果是CPU密集型应用,则线程池大小设置为N+1 如果是IO密集型应用,则线程池大小设置为2N+1(因为io读数据或者缓存的 ...

  3. mysql 8.0.13 zip windows 10安装

    1.下载安装包 https://dev.mysql.com/downloads/mysql/ 下载后解压到D:\Program Files\mysql-8.0.13-winx64 2.添加配置文件my ...

  4. Selenium-ActionChainsApi介绍

    ActionChains 模拟鼠标悬浮到某一个位置,做一系列的连贯操作,使用Selenium提供的ActionChains模块 引入方式 from selenium.webdriver.common. ...

  5. 一篇文章让你详细了解何为JSON

    JSON详解: JSON的全称是“ JavaScript Object Notation”,意思是JavaScript对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式.XML也是一种数据交 ...

  6. php随机数原理

    php随机数原理: 系统自动生成一个随机数种子(mt_srand函数可以自己生成种子),mt_rand先判断是否有生成种子,没有就自动生成一个,然后根据种子生成随机数. 生成10000-99999随机 ...

  7. Angular:ViewProviders和Providers的区别

    在Angular中使用依赖注入(DI)的时候,我们一般会使用providers.其实要做同样的事我们还有另外一个选择:viewProviders. viewProviders允许我们定义只对组件的vi ...

  8. MapGIS IGServer for java

    但是安装完之后,服务里面没有找到igserver服务 IGServer SManager cxf 怎么会找不到类呢?是服务映射出了问题,所以目录找不到.所以怎么配置目录呢?是在xml还是环境变量,还是 ...

  9. [CSP-S模拟测试]:Median(暴力+模拟)

    题目描述 定义两个数列: $$S=\{S(1),S(2),...,S(n)\}\text{和}S_2\{S_2(1),S_2(2),...,S_2(n)\}$$ $$S(k)=(p_k\times k ...

  10. localhost和127.0.0.0

    ,网络通信知识. 127.0.0.1是环回地址,只有本机可以访问 0.0.0.0是本机地址,内网外网均可以访问 localhost是本机域名,只有本机可以访问 ip是分五类