我心中的ASP.NET Core 新核心对象WebHost(二)
这是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)
}
- 从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/&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>
我心中的ASP.NET Core 新核心对象WebHost(二)的更多相关文章
- 我心中的ASP.NET Core 新核心对象WebHost(一)
以本系列文章向Fish 前辈的那篇我心中的ASP.NET 核心对象致敬.(虽然不知道前辈现在在干什么).一晃就6年过去了,那首 郝云 的<回到那一天>怎么唱来着? 时光一晃,你就三十了. ...
- ASP.NET Core 新核心对象WebHost(一)
以本系列文章向Fish 前辈的那篇我心中的ASP.NET 核心对象致敬.(虽然不知道前辈现在在干什么).一晃就6年过去了,那首 郝云 的<回到那一天>怎么唱来着? 时光一晃,你就三十了. ...
- ASP.NET Core中使用IOC三部曲(二.采用Autofac来替换IOC容器,并实现属性注入)
前言 本文主要是详解一下在ASP.NET Core中,自带的IOC容器相关的使用方式和注入类型的生命周期. 这里就不详细的赘述IOC是什么 以及DI是什么了.. emm..不懂的可以自行百度. 目录 ...
- ASP.NET Core 基于JWT的认证(二)
ASP.NET Core 基于JWT的认证(二) 上一节我们对 Jwt 的一些基础知识进行了一个简单的介绍,这一节我们将详细的讲解,本次我们将详细的介绍一下 Jwt在 .Net Core 上的实际运用 ...
- asp.net core新特性(1):TagHelper
进步,才是人应该有的现象.-- 雨果 今天开始,我就来说说asp.net core的新特性,今天就说说TagHelper标签助手.虽然学习.net,最有帮助的就是microsoft的官方说明文档了,里 ...
- ASP.NET Core 之 Identity 入门(二)
前言 在 上篇文章 中讲了关于 Identity 需要了解的单词以及相对应的几个知识点,并且知道了Identity处在整个登入流程中的位置,本篇主要是在 .NET 整个认证系统中比较重要的一个环节,就 ...
- [转]ASP.NET Core 之 Identity 入门(二)
本文转自:http://www.cnblogs.com/savorboard/p/aspnetcore-identity2.html 前言 在 上篇文章 中讲了关于 Identity 需要了解的单词以 ...
- ASP.NET Core框架深度学习(二) 管道对象
4.HttpContext 第一个对象 我们的ASP.NET Core Mini由7个核心对象构建而成.第一个就是大家非常熟悉的HttpContext对象,它可以说是ASP.NET Core应用开发中 ...
- 学习ASP.NET Core Razor 编程系列十二——在页面中增加校验
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
随机推荐
- ivew 限制输入 0 到 1 的数字 包括小数, 0 ,1
input <FormItem label="> <Input v-model="formItem.shapeDifferen.breastScaleOutSpa ...
- HTML5 中list 和datalist实例
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- mysql 5.7以上版本下载及安装
一.下载 1.mysql官网下载地址:https://downloads.mysql.com/archives/community/ 2.下载完成后解压,解压后如图: 3.放置位置,把解压好的文件夹放 ...
- 使用django 的cache设置token的有效期
from rest_framework.authentication import BaseAuthentication from rest_framework.exceptions import A ...
- JLRoutes笔记
1.在info.plist中添加 <key>CFBundleURLTypes</key> <array> <dict> <key>CFBun ...
- [CF1166C]A Tale of Two Lands题解
比赛的时候lowerbound用错了 现场WA on test4(好吧我承认我那份代码确实有除了lowerbound以外的问题) 于是只能手动二分 (我好菜啊QAQ 经过一波数学推算,我们发现,设序列 ...
- onLayout初始化裁剪信息
在EasyConstraintLayout中初始化LayoutParamsData的paths @Override protected void onLayout(boolean changed, i ...
- mac的jvm调优工具
安装好JDK之后调优工具所在位置为: /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/jvisualvm j ...
- 测开之路七十三:用kafka实现消息队列之环境搭建
一:装java环境,确保java能正确调用 kafka下载地址:http://kafka.apache.org/downloads 下载并解压kafka: 新建两个文件夹,用于存放zookeeper和 ...
- SAT算法
今早用微云打的笔记...头大 我惊,这不是可爱的离散吗?! 建个有向图G,(Xi+Yi)加两边表示( ¬Xi+Yi)(Xi+ ¬Yi) 每个点(eg:A)加上 ¬A 下图为:(A->B)·( ¬ ...