这是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. BZOJ2588 树上静态第k大

    题意翻译 给你一棵有n个结点的树,节点编号为1~n. 每个节点都有一个权值. 要求执行以下操作: U V K:求从节点u到节点v的第k小权值. 输入输出格式 输入格式 第一行有两个整数n和m(n,m≤ ...

  2. ffmpeg参数

    a) 通用选项 -L license-h 帮助-fromats 显示可用的格式,编解码的,协议的...-f fmt 强迫采用格式fmt-I filename 输入文件-y 覆盖输出文件-t durat ...

  3. pandas 新增数据列(直接赋值、apply,assign、分条件赋值)

    # pandas新增数据列(直接赋值.apply.assign.分条件赋值) # pandas在进行数据分析时,经常需要按照一定条件创建新的数据列,然后进行进一步分析 # 1 直接赋值 # 2 df. ...

  4. vue 概念与使用vue-cli脚手架快速构建项目

    vue 定义:是一套构建用户界面的渐进式框架,Vue 采用自底向上增量开发的设计.Vue 的核心库只关注视图层,它不仅易于上手,还便于与第三方库或既有项目整合. 数据渲染机制: 核心: 响应式数据绑定 ...

  5. $_POST 和 php://input 的区别

    手册中摘取的几句话: 当 HTTP POST 请求的 Content-Type 是 application/x-www-form-urlencoded 或 multipart/form-data 时, ...

  6. bzoj5118 Fib数列2 二次剩余+矩阵快速幂

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=5118 题解 这个题一看就是不可做的样子. 求斐波那契数列的第 \(n\) 项,\(n \leq ...

  7. 移动端触摸、点击事件优化(fastclick源码学习)

    移动端触摸.点击事件优化(fastclick源码学习) 最近在做一些微信移动端的页面,在此记录关于移动端触摸和点击事件的学习优化过程,主要内容围绕fastclick展开.fastclick githu ...

  8. hibernate插入数据测试无异常,但数据库没有数据

    解决方法: spring test测试默认会将事务回滚,如果想阻止spring transactional回滚,在test方法上加注解@Rollback(false)即可. Hibernate hql ...

  9. c++读取数据

    1.cin (1)输入数字 遇到空格.回车.tab结束返回引用. #include <iostream> using namespace std; main () { int a,b; c ...

  10. PerPoly Collision(用物体本身模型做碰撞)

    打开static mesh editor,在static mesh settings里找到collision complexity选项,选择最后一项: Use Complex collision as ...