.Net Core Host 之详解
简介:
开发使用有三年经验了,想趁这个机会把net core的知识点梳理一下,也更好的研究一下.NET 5给我们带来的变化。
主机的概念:
一个主机是封装了应用程序的资源,比如一个对象:
- 依赖注入 (DI)
- 日志记录
- 配置
- IHostedService 实现
将应用程序的所有相互依赖的资源包含在一个对象中的主要原因是生命周期管理:控制应用程序启动和正常关闭。
主机的创建
主机通常由Program类中的代码配置、构建和运行。该Main方法:
- 调用CreateHostBuilder方法来创建和配置构建器对象。
- 构建器对象上的调用Build和Run方法.
1. Host.CreateDefaultBuilder(args) 主要做了以下几件事:
- 将内容根设置为GetCurrentDirectory返回的路径。
- 从以下位置加载主机配置:
- 以
DOTNET_
.为前缀的环境变量。 - 命令行参数。
- 以
- 从以下位置加载应用程序配置:
- appsettings.json。
- appsettings.{Environment}.json。
- 应用程序在
Development
环境中运行时的用户机密。 - 环境变量。
- 命令行参数。
- 添加以下日志记录提供程序:
- 安慰
- 调试
- 事件源
- EventLog(仅当在 Windows 上运行时)
- 当环境为 Development 时启用范围验证和依赖项验证
2. 对于http 工作负载,使用ConfigureWebHostDefaults 去实例化一个IWebHostBuilder并且向webbuilder增加功能配置。
public static IHostBuilder ConfigureWebHostDefaults(this IHostBuilder builder, Action<IWebHostBuilder> configure)
{
if (configure is null)
{
throw new ArgumentNullException(nameof(configure));
} return builder.ConfigureWebHost(webHostBuilder =>
{
WebHost.ConfigureWebDefaults(webHostBuilder); configure(webHostBuilder);
});
}
可以看到,ConfigureWebHostDefaults 是一个扩展方法,在内部调用 ConfigureWebHost 这个扩展方法,
ConfigureWebHost 这个扩展方法又做了哪些事情? 代码链接:https://github.com/dotnet/aspnetcore/blob/main/src/Hosting/Hosting/src/GenericHostWebHostBuilderExtensions.cs
public static class GenericHostWebHostBuilderExtensions
{
/// <summary>
/// Adds and configures an ASP.NET Core web application.
/// </summary>
public static IHostBuilder ConfigureWebHost(this IHostBuilder builder, Action<IWebHostBuilder> configure)
{
if (configure is null)
{
throw new ArgumentNullException(nameof(configure));
} return builder.ConfigureWebHost(configure, _ => { });
} /// <summary>
/// Adds and configures an ASP.NET Core web application.
/// </summary>
public static IHostBuilder ConfigureWebHost(this IHostBuilder builder, Action<IWebHostBuilder> configure, Action<WebHostBuilderOptions> configureWebHostBuilder)
{
if (configure is null)
{
throw new ArgumentNullException(nameof(configure));
} if (configureWebHostBuilder is null)
{
throw new ArgumentNullException(nameof(configureWebHostBuilder));
} var webHostBuilderOptions = new WebHostBuilderOptions();
configureWebHostBuilder(webHostBuilderOptions);
var webhostBuilder = new GenericWebHostBuilder(builder, webHostBuilderOptions);
configure(webhostBuilder);
builder.ConfigureServices((context, services) => services.AddHostedService<GenericWebHostService>());
return builder;
}
}
通过实例化一个 GenericWebHostBuilder 实例,扩展HostBuilder ASP.NET Core的运行时配置。
ConfigureWebHost 中的confiure 其实执行的是:
WebHost.ConfigureWebDefaults(webHostBuilder);
configure(webHostBuilder); (2)
(2) 执行的是我们在program 代码里进行的设置。例如 webBuilder.UseStartup<Startup>()。
有读者比较感兴趣 GenericWebHostBuilder 这个类具体都做了什么,因为内容较多,不放在这里展示,实例化后的 WebHostBuilder 内部拥有 HostBuilder,并且为其扩展了各种web 运行时的配置;
最后,回到 WebHost.ConfigureWebDefaults(webHostBuilder) ,它为注入的 webHostBuilder启用各类配置:
- 从前缀为 的环境变量加载主机配置
ASPNETCORE_
。 - 将Kestrel服务器设置为 Web 服务器并使用应用的托管配置提供程序对其进行配置。
- 添加主机过滤中间件。
- 如果等于,则添加转发头中间件。
ASPNETCORE_FORWARDEDHEADERS_ENABLED
true
- 启用 IIS 集成。
3. 主机的build
通过 CreateHostBuilder(args).Build() 去构建主机。
这其中主要是:
- 构建配置系统
- 构建主机环境信息
- 构建主机build 上下文
- 构建应用程序配置
- 创建依赖注入提供程序,依赖注入容器
总而言之:(如果你忽略上面的一整段,此处要看)
(1) 创建了HostBuilder -> (2) 为hostbuilder添加 aspnet core运行时的配置 -> (3) 启用各类web 运行时需要的配置 -> (4) 根据加载好的各种配置构建主机运行时需要提供的服务(configuration, DI Container, 应用程序配置等)
会持续整理发布关于后端和NET Core, .NET 的相关学习和认知,欢迎大家一起讨论学习。
.Net Core Host 之详解的更多相关文章
- net core体系-web应用程序-4net core2.0大白话带你入门-5asp.net core环境变量详解
asp.net core环境变量详解 环境变量详解 Windows操作系统的环境变量在哪设置应该都知道了. Linux(centos版本)的环境变量在/etc/profile里面进行设置.用户级的 ...
- Linux core dump file详解
Linux core dump file详解 http://www.cnblogs.com/langqi250/archive/2013/03/05/2944931.html
- 【转】asp.net core环境变量详解
asp.net core环境变量详解 环境变量详解 Windows操作系统的环境变量在哪设置应该都知道了. Linux(centos版本)的环境变量在/etc/profile里面进行设置.用户级的环境 ...
- asp.net core环境变量详解
环境变量详解 Windows操作系统的环境变量在哪设置应该都知道了. Linux(centos版本)的环境变量在/etc/profile里面进行设置.用户级的环境变量在其它文件里面,不多说了,有兴趣的 ...
- ASP.NET Core真实管道详解[1]:中间件是个什么东西?
ASP.NET Core管道虽然在结构组成上显得非常简单,但是在具体实现上却涉及到太多的对象,所以我们在 <ASP.NET Core管道深度剖析[共4篇]> 中围绕着一个经过极度简化的模拟 ...
- ASP.NET Core 中 HttpContext 详解与使用 | Microsoft.AspNetCore.Http 详解 (转载)
“传导体” HttpContext 要理解 HttpContext 是干嘛的,首先,看图 图一 内网访问程序 图二 反向代理访问程序 ASP.NET Core 程序中,Kestrel 是一个基于 li ...
- ASP.NET Core 中 HttpContext 详解与使用 | Microsoft.AspNetCore.Http 详解
笔者没有学 ASP.NET,直接学 ASP.NET Core ,学完 ASP.NET Core MVC 基础后,开始学习 ASP.NET Core 的运行原理.发现应用程序有一个非常主要的 “传导体” ...
- ASP.NET Core真实管道详解[1]
ASP.NET Core管道虽然在结构组成上显得非常简单,但是在具体实现上却涉及到太多的对象,所以我们在 <ASP.NET Core管道深度剖析[共4篇]> 中围绕着一个经过极度简化的模拟 ...
- MongoDB via Dotnet Core数据映射详解
用好数据映射,MongoDB via Dotnet Core开发变会成一件超级快乐的事. 一.前言 MongoDB这几年已经成为NoSQL的头部数据库. 由于MongoDB free schema ...
随机推荐
- JAVA并发(2)-ReentrantLock的见解
上节,我们讲了AQS的阻塞与释放实现原理,线程间通信(Condition)的原理.这次,我们就讲讲基于AQS实现的ReentrantLock(重入锁). 1. 介绍 结合上面的ReentrantLoc ...
- zabbix自带的模板监控mysql
科技小能手 2017-11-12 1208浏览量 简介: zabbix官方支持监控MySQL,但直接使用默认的模板是不可用的,还需要经过额外的设置才可以使用.如果只需要对mysql数据库做简单的监控, ...
- Python socket 编程实验
实验内容 1.编写一个基于UDP协议的客户机与服务器程序,实现相互通讯. 2.编写一个基于TCP协议的客户机与服务器程序,实现相互通讯. 3.捕获以上两种通讯的数据包,使用Wireshark进行分析, ...
- Linux创建RAID10_实战
Linux创建RAID10_实战 Linux创建RAID10 RAID10 是先将数据进行镜像操作,然后再对数据进行分组,RAID1 在这里就是一个冗余的备份阵列,而RAID0则负责数据的读写阵列 至 ...
- Ansible_使用jinja2模板部署自定义文件
一.jinja2简介 1.jinja2模板 1️⃣:Ansible将jinja2模板系统用于模板文件,Ansible还使用jinja2语法来引用playbook中的变量 2️⃣:变量和逻辑表达式置于标 ...
- inux软件安装管理之——dpkg与apt-*详解
inux软件安装管理之--dpkg与apt-*详解 Nosee123关注 0.5922017.09.12 17:47:44字数 3,894阅读 8,565 [Linux软件安装管理系列]- - 传送门 ...
- HDFS 的内存存储是什么?
引言 HDFS 的定位就是一个文件系统,用于存储文件,而 HDFS 对于文件的存储方式有两种: 内存存储 异构存储 内存存储 什么是内存存储? 首先,我们来了解一下到底什么是 "内存存储&q ...
- 服务器RAID配置
一.RAID介绍RAID是Redundent Array of Inexpensive Disks的缩写,直译为"廉价冗余磁盘阵列",也简称为"磁盘阵列".后来 ...
- 荷小鱼 x mPaaS | 借助 H5 容器改善 App 白屏、浏览器兼容等问题
随着5G.大数据.人工智能技术的应用,各类传统行业纷纷大力推进数字化转型升级. 而受疫情的影响,教育行业也在大幅加速线上化转型进程,各类在线教育应用也在借助各种力量拓张自己的移动端市场领域. 「荷 ...
- Hadoop 基石HDFS 一文了解文件存储系统
@ 目录 前言:浅谈Hadoop Hadoop的发展历程 1.1 Hadoop产生背景 1.引入HDFS设计 1.1 HDFS主要特性 2.HDFS体系结构 HDFS工作流程机制 1.各个节点是如何互 ...