一张图理清ASP.NET Core启动流程

2023-11-18

1. 引言

对于ASP.NET Core应用程序来说,我们要记住非常重要的一点是:其本质上是一个独立的控制台应用,它并不是必需在IIS内部托管且并不需要IIS来启动运行(而这正是ASP.NET Core跨平台的基石)。ASP.NET Core应用程序拥有一个内置的Self-Hosted(自托管)的Web Server(Web服务器),用来处理外部请求。

不管是托管还是自托管,都离不开Host(宿主)。在ASP.NET Core应用中通过配置并启动一个Host来完成应用程序的启动和其生命周期的管理(如下图所示)。而Host的主要的职责就是Web Server的配置和Pilpeline(请求处理管道)的构建。

这张图描述了一个总体的启动流程,从上图中我们知道ASP.NET Core应用程序的启动主要包含三个步骤:

  1. CreateDefaultBuilder():创建IWebHostBuilder

  2. Build():IWebHostBuilder负责创建IWebHost

  3. Run():启动IWebHost

所以,ASP.NET Core应用的启动本质上是启动作为宿主的WebHost对象。
其主要涉及到两个关键对象IWebHostBuilder和IWebHost,它们的内部实现是ASP.NET Core应用的核心所在。下面我们就结合源码并梳理调用堆栈来一探究竟!

2. 宿主构造器:IWebHostBuilder

在启动IWebHost宿主之前,我们需要完成对IWebHost的创建和配置。而这一项工作需要借助IWebHostBuilder对象来完成的,ASP.NET Core中提供了默认实现WebHostBuilder。而WebHostBuilder是由WebHost的同名工具类(Microsoft.AspNetCore命名空间下)中的CreateDefaultBuilder方法创建的。

从上图中我们可以看出CreateDefaultBuilder()方法主要干了六件大事:

  1. UseKestrel:使用Kestrel作为Web server。

  2. UseContentRoot:指定Web host使用的content root(内容根目录),比如Views。默认为当前应用程序根目录。

  3. ConfigureAppConfiguration:设置当前应用程序配置。主要是读取 appsettinggs.json 配置文件、开发环境中配置的UserSecrets、添加环境变量和命令行参数 。

  4. ConfigureLogging:读取配置文件中的Logging节点,配置日志系统。

  5. UseIISIntegration:使用IISIntegration 中间件。

  6. UseDefaultServiceProvider:设置默认的依赖注入容器。

创建完毕WebHostBuilder后,通过调用UseStartup()来指定启动类,来为后续服务的注册及中间件的注册提供入口。

3. 宿主:IWebHost

在ASP.Net Core中定义了IWebHost用来表示Web应用的宿主,并提供了一个默认实现WebHost。宿主的创建是通过调用IWebHostBuilder的Build()方法来完成的。那该方法主要做了哪些事情呢,我们来看下面这张【ASP.NET Core启动流程调用堆栈】中的黄色边框部分:

其核心主要在于WebHost的创建,又可以划分为三个部分:

  1. 构建依赖注入容器,初始通用服务的注册:BuildCommonService();

  2. 实例化WebHost:var host = new WebHost(...);

  3. 初始化WebHost,也就是构建由中间件组成的请求处理管道:host.Initialize();

3.1. 注册初始通用服务

BuildBuildCommonService方法主要做了两件事:

  1. 查找HostingStartupAttribute特性以应用其他程序集中的启动配置

  2. 注册通用服务

  3. 若配置了启动程序集,则发现并以IStartup类型注入到IOC容器中

3.2. 创建IWebHost

public IWebHost Build(){    //省略部分代码

    var host = new WebHost(
        applicationServices,
        hostingServiceProvider,
        _options,
        _config,
        hostingStartupErrors);
    }
    
    host.Initialize();   
    return host;
}

3.3. 构建请求处理管道

请求管道的构建,主要是中间件之间的衔接处理。

而请求处理管道的构建,又包含三个主要部分:

  1. 注册Startup中绑定的服务;

  2. 配置IServer;

  3. 构建管道

请求管道的构建主要是借助于IApplicationBuilder,相关类图如下:

4. 启动WebHost

WebHost的启动主要分为两步:

  1. 再次确认请求管道正确创建

  2. 启动Server以监听请求

  3. 启动 HostedService

4.1. 确认请求管道的创建

从图中可以看出,第一步调用Initialize()方法主要是取保请求管道的正确创建。其内部主要是对BuildApplication()方法的调用,与我们上面所讲WebHost的构建环节具有相同的调用堆栈。而最终返回的正是由中间件衔接而成的RequestDelegate类型代表的请求管道。

4.2. 启动Server

我们先来看下类图:

从类图中我们可以看出IServer接口主要定义了一个只读的特性集合属性、一个启动和停止的方法声明。在创建宿主构造器IWebHostBuilder时我们通过调用UseKestrel()方法指定了使用KestrelServer作为默认的IServer实现。其方法申明中接收了一个IHttpApplication<TContext> application的参数,从命名来看,它代表一个Http应用程序,我们来看下具体的接口定义:

其主要定义了三个方法,第一个方法用来创建请求上下文;第二个方法用来处理请求;第三个方法用来释放上下文。而至于请求上下文,是用来携带请求和返回响应的核心参数,其贯穿与整个请求处理管道之中。ASP.NET Core中提供了默认的实现HostingApplication,其构造函数接收一个RequestDelegate _application(也就是链接中间件形成的处理管道)用来处理请求。

var httpContextFactory = _applicationServices.GetRequiredService<IHttpContextFactory>();var hostingApp = new HostingApplication(_application, _logger, diagnosticSource, httpContextFactory);

4.3. 启动IHostedService

IHostedService接口用来定义后台任务,通过实现该接口并注册到Ioc容器中,它会随着ASP.NET Core 程序启动而启动,终止而终止。

5. 总结

结合源码,通过对ASP.NET Core运行调用堆栈的梳理,其启动流程的总体脉络一目了然,并且了解到主要的几个关键对象:

  1. 负责创建IWebHost的宿主构造器IWebHostBuilder

  2. 代表宿主的IWebHost接口

  3. 用于构建请求管道的IApplicationBuilder

  4. 中间件衔接而成的RequestDelegate

  5. 代表Web Server的IServer接口

  6. 贯穿请求处理管道的请求上下文HttpContext

  7. 可以用来注册后台服务的IHostedService接口

这一节就先从总体上对ASP.NET Core的运行原理有个基本的认识,后续我们再一一讲解这几个核心对象来加深理解。

原文地址: http://www.cnblogs.com/sheng-jie/p/7640163.html 

  
  

.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一张图理清ASP.NET Core启动流程 的相关文章

  • 浪潮服务器通过DHCP获取地址进入IPMI,BMC管理后台的方法,可实现远程安装系统、温度运行状态监测、风扇转速调整、远程开关机、KVM控制台显示器等功能

    前言 这里主要介绍通过DHCP进入BMC管理后台的方法 在官方网站有介绍的地方会直接给链接 这里就不在赘述 配置网络 DHCP获取地址 这个方法适用于没有手动设置过BMC地址的情况 这里用到的DHCP工具是 深度远程启动管理器 深度远程启动
  • 面试准备:MySQL建立索引的原则

    文章目录 建立索引 1 和in可以乱序 2 最左前缀匹配原则 3 尽量选择区分度高的列作为索引 4 索引列不能参与计算 5 尽量的扩展索引 不要新建索引 6 为经常需要排序 分组和联合操作的字段建立索引 7 为常作为查询条件的字段建立索引
  • 【山河送书第十一期】:朋友圈大佬都去读研了,这份备考书单我码住了,考研书籍五本!!

    朋友圈大佬都去读研了 这份备考书单我码住了 数据结构与算法分析 计算机网络 自顶向下方法 现代操作系统 深入理解计算机系统 概率论基础教程 原书第10版 线性代数 原书第10版 线性代数及其应用 重磅推荐 参与方式 往期赠书回顾 八九月的朋
  • AlmaLinux 安装过程解析

    此文将对AlmaLinux操作系统安装过程进行解析 对于经常使用Linux系统的大佬 可能对此安装过程有些乏味 但鉴于目前为止 似乎没有一篇安装的过程解析 那不妨由笔者写下一篇吧 笔者软件安装环境 VMware VMware Worksta
  • 提升模型效果的途径

    模型效果不佳 可以考虑从以下几个方面进行改进 数据增广 1 基于图像处理的数据增广 几何变换 旋转 缩放 翻转 剪裁 平移 仿射变换 颜色空间变换 亮度 对比度 饱和度调整 颜色空间转行 色彩调整 添加噪声和滤波 注入高斯噪声 椒盐噪声 模
  • Python模糊控制库使用(基本操作与仿真结果3D显示)

    Python模糊控制库使用 模糊控制库安装 示例 定义模糊控制变量 模糊隶属函数 模糊规则 激活模糊控制器 3D可视化结果 完整代码 模糊控制库安装 模糊控制库github 链接 Github python pip安装 pip instal
  • 第三十九章、PyQt显示部件:OpenGL Widget部件功能简介及使用其显示图片

    专栏 Python基础教程目录 专栏 使用PyQt开发图形界面Python应用 专栏 PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一 概述 OpenGL Widget部件是一个OpenGL Open Graphics L
  • java反射机制 (属性,注解)(代码)

    博学谷IT学习技术支持 1案例的类 import com example demo3 fanshe MyAnnotation import lombok Data author zw Description 描述 create 2022 2
  • YOLOv8+BoT-SORT多目标跟踪(行人车辆计数与越界识别)

    课程链接 https edu csdn net course detail 38919 BoT SORT是发表于2022年的先进的多目标跟踪算法 它结合了运动和外观信息 相机运动补偿和更准确的卡尔曼滤波状态向量 并把这些改进集成到ByteT
  • vue的环境搭建2023,idea,vscode踩坑记录

    由于看了19 20年的几篇博客 导致搭建vue环境一部分环节出大问题 大家还是看官方文档吧 血泪教训 不说废话直接开始 1 nodejs下载 下载地址 https nodejs org zh cn 下载稳定版 安装过程我是一路next 就是
  • python之折半查找算法

    折半查找算法也叫二分查找算法 算法的细节我就不讲了 但是必须说一下二分查找是基于我们之前的数据是有序的 如果没有序该算法是没有意义的 个人觉得代码比较直观 所以我这里就直接上代码了 折半查找非递归算法 折半查找非递归算法 折半查找函数 参数
  • 实验二 势函数算法的迭代训练

    实验二 势函数算法的迭代训练 一 实验目的 通过本实验的学习 使学生了解或掌握模式识别中利用势函数思想设计非线性判别函数的方法 能够实现模式的分类 学会运用已学习的先导课程如数据结构和算法设计知识 选用合适的数据结构完成算法的设计和程序的实
  • Python获取文件名和文件类型

    def get file info path dir path file full name os path split path file name file type os path splitext file full name re
  • [搬家前]代码走查

    代码走查 就是一群人一起 对别人写的代码进行分析 在算法上 在具体实现上 提出改进的意见 以使得程序更加健壮 更加有效率 今天对我写的一个Java Mail程序进行走查 自我感觉写得是有点丑 但是基本功能还是实现得很好的 经过走查 我收获很
  • 基于SpringBoot的高校党务管理系统

    系列文章目录 基于PHP的旅游管理系统 基于SSM的毕业设计管理系统 基于SpringBoot的高校在线答疑管理系统 目录 系列文章目录 一 相关技术 二 系统功能 三 系统页面 1 管理员功能页面 2 学生功能页面 3 党组织功能页面 4
  • 2021年安装deepin20.3和windows双系统

    2021年安装deepin20 3和windows双系统 1 前言 如你所见deepin最近发布了它的社区版20 3 这次带来几个重要的更新 更强大的内核版本 Stable内核升级到5 15版本 增强对Intel 12代U和NTFS文件系统
  • 利用dup函数实现基本的CGI服务器

    复制文件描述符的dup和dup2函数 include
  • Java设计模式(1):观察者模式

    面向对象思想设计原则 在实际的开发中 我们要想更深入的了解面向对象思想 就必须熟悉前人总结过的面向对象的思想的设计原则 1 单一职责原则 其实就是开发人员经常说的 高内聚 低耦合 也就是说 每个类应该只有一个职责 对外只能提供一种功能 而引
  • vue计时器(点击按钮1计时,点击按钮2结束计时清除定时器,时间显示格式为:00:00:00)

    html
  • IDEA设置默认maven配置

    前言 当你刚开始使用idea的时候 他会默认选用你本地C盘的maven仓库 而且随着maven使用的越多 C盘就会出现爆满的情况 这个时候我们需要自己下载一个maven仓库或者是把C盘的仓库移到其他盘里去 这里我提供了两个不同版本的mave

随机推荐

  • 疯壳AI语音及人脸识别教程3-5加解密及数据协议

    详情地址 https fengke club GeekMart views offline ai 购买链接 https fengke club GeekMart su fKw7Nb7oC jsp 视频地址 https fengke club
  • Xilinx ISE系列教程(9):LabTools下载、安装、使用教程(独立的下载工具)

    文章目录 1 ISE Vivado LabTools简介 2 ISE 14 7 Lab Tools下载 安装 3 Vivado 2018 3 LabTools下载 安装 1 ISE Vivado LabTools简介 Xilinx LabT
  • #ifndef... #define与#pragma once总结

    前几天看到同一个项目中有的地方使用了 ifndef define endif 而有的地方却用了 pragma once 于是我就纠结了 这两者有神马区别呢 今天仔细查了一下 发现还是有一点点的区别 不过不大 简单记录一下 一 简介 ifnd
  • lineageos 编译出错:error: VNDK version 30 not found.

    同步源代码后开始编译 结果一开始就提示这个错误 los17 1和los19 1都正常 los18 1就不行 提取了vndk 30后又会提示新的错误 该怎么解决
  • WSL2 Ubuntu+gnome图形界面的安装血泪史(亲测有效)

    WSL2 Ubuntu gnome图形界面 写在最前面 血泪史 1 wsl2 安装 2 Ubuntu安装 3 VcXsrv安装与启动 4 gnome图形界面的配置 5 显卡驱动的升级 6 wsl2与VMware虚拟机共存 本地与WSL文件传
  • docker常用的Linux命令

    docker 帮助 docker h 查看镜像 docker images 查看容器 docker ps 进入容器 docker exec it web 容器id的前几位或容器名 bin bash 有些地方是bash 具体地方具体定 退出容
  • Cesium教程 (3) 矢量切片mvt-imagery-provider加载

    Cesium教程 3 矢量切片mvt imagery provider加载 目录 0 矢量切片 1 开源项目 2 环境 3 代码 4 进阶 5 TODO 0 矢量切片 WMTS 加载最快 图片格式 样式固定 WMS 加载数量大则慢 但可以点
  • VScode项目中文件后面的A/U/M...是什么意思?

    问题 VScode项目中文件后面的A U M 是什么意思 回答 git 添加过该文件 然后你对这个文件进行了修改 就会文件后标记M M modified 你在本地新建了这个文件 还未提交到 git 上 就会标记文件或没有被合并 你需要完成合
  • rocksd mysql_mysql rocksdb使用报告

    作者 某网盘DBA 转发已经过作者同意 如果有其他问题请及时联系 非经过允许请勿随意转发 尊重版权 感谢 背景 rocksdb是facebook基于google的leveldb二次开发的key value存储引擎 目前 facebook已将
  • cenos 6.4 安装memcached 服务端

    本文查考借鉴 yum 安装memcached 前提 阿里云 EDS 服务器 操作系统 CentOs 6 4 第一步 查询memcached 安装资源包信息 yun search memcached 该指令可以查询yum库中 所包含memca
  • Centos 安装Vsftpd

    1 安装VSFTP 1 root localhost yum y install vsftpd 2 配置vsftpd conf文件 root localhost vi etc vsftpd vsftpd conf 001 002 003 0
  • tkinter绘制组件(12)——表格

    tkinter绘制组件 12 表格 引言 构思 外观 绘制方法 布局 函数结构 绘制表头 绘制表格内容 获取高度和重绘 完整代码函数 效果 测试代码 最终效果 2021 12 12新样式 2022 1 2新样式 2022 7 3新功能 补充
  • 知识图谱实现步骤和用到的方法

    PDF 下载 https download csdn net download nrlovestudy 10938925 参考资料 1 知识图谱入门 一 知识图谱与语义技术概览 https blog csdn net pelhans art
  • 【CSS】background相关属性深入学习

    最近一次需求中对于background相关的一些属性使用较多 总结下 希望提高下次的开发效率 background属性 background color background image background position backgr
  • .NET面试题——第7篇 C#类和对象

    1 什么是类和对象以及关系 对象 一种具有状态 属性 和行为 方法 的编程实体 用于描述现实世界的某个具体事物 类 具用一系列对象共同特征和行为的通用类型 对象和类的关系 类是对象的抽象 而对象是类的具体实例 类是抽象的 不占用内存 而对象
  • go爬虫框架colly的精简讲解

    1 拉取软件包 go get github com gocolly colly 2 创建colly的收集器 colly NewCollector 可以在创建的时候进行配置 c colly NewCollector colly AllowUR
  • Java 断点调试 循环调试

    java断点调试 以eclipse为例 1 基础调试 这里都是一些基础 除了最后一个都十分常用 名称 快捷键 作用 Resume F8 运行至下一断点 Step Into F5 进入方法 Step Over F6 运行完当前语句 User
  • PCL 点云按高程渲染颜色

    目录 一 算法原理 二 代码实现 三 结果展示 四 CloudCompare 五 备注 一 算法原理 首先按照Z轴方向求取所在点云的高程极值 包括高程最大值与最小值 计算高程中值 然后选取渲染的红 绿 蓝三种颜色的值 最后 自上而下 为红绿
  • NBA的字母哥如何拿到2415万美金年薪

    前言 NBA是世界上最成功的体育联盟之一 为了制定合理的运作规范 联盟会与球员工会签署劳资协议 协议里规定了球队的工资帽 一支球队球员工资总额的上限 顶薪 球员薪水的上限 底薪 球员的最低薪水 和其他规范 2011年 经历了停摆事件 联盟和
  • 一张图理清ASP.NET Core启动流程

    1 引言 对于ASP NET Core应用程序来说 我们要记住非常重要的一点是 其本质上是一个独立的控制台应用 它并不是必需在IIS内部托管且并不需要IIS来启动运行 而这正是ASP NET Core跨平台的基石 ASP NET Core应