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

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

  1. UseKestrel 设置Kestrel为HttpServer

  2. ConfigureAppConfiguration 设置了配置文件

  3. ConfigureLogging 配置了日志处理器,添加了 Debug和控制台两种方式

  4. UseStartup 指定了Startup类

有了一个WebHostBuilder之后,我们就可以调用它的Build方法来构建一个WebHost。
我们可以先来看一下Build方法的代码

// 初始化DIvar 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的第三阶段:启动过程 

原文:http://www.jessetalk.cn/2017/11/14/aspnet-core-object-webhost-build/ 


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/322860.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue及React脚手架安装

React npm i -g create-react-app create-react-app project React路由安装 yarn add react-router-dom Vue cnpm install -g vue-cli vue create project

Hadoop生态Flume(三)拦截器(Interceptor)介绍与使用(1)

转载自 Flume中的拦截器&#xff08;Interceptor&#xff09;介绍与使用&#xff08;一&#xff09; Flume中的拦截器&#xff08;interceptor&#xff09; 用户Source读取events发送到Sink的时候&#xff0c;在events header中加入一些有用的信息&#xff0c;或者对events的…

SOA对微服务的残余影响

近日&#xff0c;Tareq Abedrabbo在伦敦2017 Con微服务大会上说&#xff0c;SOA对微服务架构设计的残余影响仍然存在&#xff0c;包括技术选型和组织方面的问题。最直接的一个例子就是大多数企业仍然区分对待架构师和开发人员&#xff0c;架构师负责出规范&#xff0c;开发人员…

如何查看python安装路径

import sys sys.path 我的安装地址 python2: C:\Users\Tecna1205\Miniconda python3: C:\Users\Tecna1205\AppData\Local\Programs\Python\Python37 python3 -m pip install --upgrade pip --force-reinstall

jzoj4245-er【dp,贪心】

正题 题目大意 nnn个武器(n≤2n\leq2n≤2)&#xff0c;mmm个符文 符文1:直接改变一个武器的攻击力(最多一个) 符文2:增加一个武器的攻击力 符文3:使一个人的武器攻击力翻若干倍 求武器攻击力乘积最大&#xff0c;输出答案的自然对数。 解题思路 首先log(ab)log(a)log(b)lo…

Hadoop生态Flume(四)拦截器(Interceptor)介绍与使用(2)

转载自 Flume中的拦截器&#xff08;Interceptor&#xff09;介绍与使用&#xff08;二&#xff09; lume中的拦截器&#xff08;interceptor&#xff09;&#xff0c;用户Source读取events发送到Sink的时候&#xff0c;在events header中加入一些有用的信息&#xff0c;或者对…

协作更进一步:微软隆重介绍Visual Studio动态分享功能

微软刚刚在 Visual Studio Code 网站上宣布了“动态分享”&#xff08;Live Share&#xff09;功能&#xff0c;开发者们可以在 VS 2017 或 VS Code 中体验全新的实施协作。微软表示&#xff0c;Live Share 可让团队在相同的代码库上启用快速协作&#xff0c;而无需同步代码或配…

python打包exe文件

首先安装pyinstaller pip3 install pyinstaller接着导报指定文件 pyinstaller.exe -F 文件路径文件名 举例 pyinstaller.exe -F C:\Users\Tecna1205\Desktop\工作目录\Python工作目录\测试\3.3\test\tk.py 如果有图形界面&#xff0c;不想打开命令行&#xff0c;可在打包命令…

SpringBoot maven打包源码发布到仓库配置

一、项目pom.xml配置 添加发布仓库 配置上传源码 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocatio…

使用MS Test做单元测试

声明&#xff1a;本篇博客翻译自&#xff1a;http://www.c-sharpcorner.com/article/unit-testing-with-ms-tests-in-c-sharp/ 写在翻译之前&#xff1a; 依然清晰的记得刚工作的第一个项目中&#xff0c;在完成一个功能模块开发后&#xff0c;师傅让我把代码做一下单元测试。当…

jzoj4246-san【最短路,SPFA,DAGdp】

正题 题目大意 nnn个点&#xff0c;mmm条边&#xff0c;若两个点之间的任意一条最短路长度为奇数则称之为不和谐最短路。求每个点有多少条不和谐最短路经过。 解题思路 首先SPFASPFASPFA求一个多元最短路。 然后枚举起点&#xff0c;对于每个起点&#xff0c;我们只走最短路上…

Vue组件传参

父组件向子组件传参 数据&#xff1a; 父组件 <test :message"msg"></test>msg: Hello uniApp子组件&#xff08;test.vue&#xff09; <text>{{message}}</text>props:["message"]子组件向父组件传参 子组件&#xff1a; &…

SpringBoot2.1.9 多Kafka消费者配置

一、配置文件 pom.xml <dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId> </dependency> application.yml spring:application:name: double-kafka-consumerprofiles:active: devjacks…

如果不懂Service mesh,就不要谈微服务了

提到微服务&#xff0c;spring cloud等经典框架被使用的最为广泛&#xff0c;但是在2016年才被提起的Service Mesh&#xff0c;已经被Paypal、Lyft、Ticketmaster和Credit Karma等等一些大流量平台所使用&#xff0c;在生产应用中添加了Service mesh。今年随着Linkerd传入国内&…

欢乐纪中某B组赛【2019.1.29】

前言 Rank1Rank1Rank1耶 成绩 RankRankRank是有算别人的 RankRankRankPersonPersonPersonScoreScoreScoreAAABBBCCC1112017myself2017myself2017myself2802802801001001008080801001001003332017xjq2017xjq2017xjq2002002001001001000001001001001212122017hjq2017hjq2017hjq15…

mysq和mysqli关系

1、在php5版本之前&#xff0c;一般是用php的mysql函数去驱动mysql数据库的&#xff0c;比如mysql_query()的函数&#xff0c;属于面向过程. 2、在php5版本以后&#xff0c;增加了mysqli的函数功能&#xff0c;某种意义上讲&#xff0c;它是mysql系统函数的增强版&#xff0c;更…

SpringBoot2.1.9 分布式锁ShedLock

一、分布式锁配置 &#xff08;1&#xff09;redis锁 pom.xml <dependency><groupId>net.javacrumbs.shedlock</groupId><artifactId>shedlock-spring</artifactId><version>2.5.0</version> </dependency><dependency&…

使用AspectCore动态代理

前言 最近越来越多的同学关注到AspectCore&#xff0c;并且提出不少中肯的建议&#xff0c;其中最多的提议是希望能够看到更多的关于AspectCore使用方式的文章和Demo。那么在这篇文章里&#xff0c;我们就来聊聊AspectCore核心之一的动态代理。 动态代理 在.NET平台中&#xff…

P1131-[ZJOI2007]时态同步【树形dp】

正题 题目大意 一棵树&#xff0c;可以增长边权长度&#xff0c;要求根节点要每个叶子节点路径长度相等&#xff0c;求最少增加次数。 解题思路 肯定优先修改上面的边&#xff0c;因为这样可以影响最多的点&#xff0c;那么对于每个节点我们都要使它到每个它子树中叶子节点的…

已经安装完成mysql后wamp怎么配置

如果之前安装过mysql&#xff0c;然后想要安装wamp&#xff0c;那么怎么配置呢 先安装好wamp&#xff0c;然后在以下目录中修改my.ini 将密码改为自己的mysql密码即可 这时你发现启动wamp还是黄的 不要慌&#xff0c;因为你已经安装过了wamp&#xff0c;所以wamp自己的mys…