主机--Host
概念:主机是用于构建应用程序和服务、封装应用资源的对象,负责程序的启动和生命周期的管理,简单来说主机即应用程序。
主机运行:当主机运行的时候,他会将托管在服务容器集合里面注册的IHostService
的每个实现调用IHostService.StartAsync()
。在web应用中,每一个IHostService
实现就是启动。
需要掌握:
- 主机的作用是什么?
- 主机的种类、对应的版本?
- 泛型主机的代码上和逻辑上的构造流程
- 泛型主机替换Web主机的原因以及通过什么拓展方法来支持Http负载?
主机的种类和构建方式
1. WebHost(范围:3.0版本之前)官网
在3.0版本之前,当我们构建Web应用的时候,Program.cs默认构建的主机类型是WebHost,在CreateWebHostBuilder()方法中通过调用WebHost静态类的CreateDefaultBuilder()方法返回一个IWebHostBuilder对象,
然后调用Build()
方法和Run()
方法来构建主机和运行主机。
流程:获取WebHost构建器
-> 调用Build()
方法生成主机实例 -> Run()
方法
2.1版本
// WebAPI的Program.cs
public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
/// <summary>
/// 生成Web应用主机
/// </summary>
/// <param name="args"></param>
/// <returns></returns>
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>());
}
2. 泛型Host(范围:3.0版本之后)官网
3.0以后微软将主机类型替换为了Host
通用主机,通过在CreatHostBuilder()
中调用Host.reateDefaultBuilder()
方法返回一个IHostBuilder对象
,然后调用Build()方法和Run()方法
来构建主机和运行主机。
在3.0版本,微软对Host
进行了升级,原本Host
只能用于非HTTP负载,但是通过调用ConfigureWebHostDefaults()拓展方法
来实现HTTP负载。
在6.0版本,微软对于netcore进行了大升级,Program.cs
文件发生了很大的改变,所以下方将会分为2个部分来分别介绍3.0版本到5.0版本的泛型Host是如何创建的?6.0版本的泛型Host是如何创建的?
3.0版本到5.0版本的的创建泛型Host
流程:获取IHostBuilder
-> 调用ConfigureWebHostDefaults()
方法来拓展WebHost
(web应用需要调用此拓展方法,非web应用,如WokerService则不需要) -> 调用Build()
方法生成主机实例 -> Run()
方法
5.0版本
// WebAPI的Program.cs文件
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
/// <summary>
/// 生成通用主机
/// </summary>
/// <param name="args"></param>
/// <returns></returns>
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
// 因为是WebAPI,所以要调用此拓展服务,配置WebAPI的配置,如中间件、服务等。
// 使用拓展方法UseStartup()指向Startup文件
// 官方描述:用于托管Web应用程序的默认值配置
.ConfigureWebHostDefaults(Builder =>
{
Builder.UseStartup<Startup>();
});
}
ConfigureWebHostDefaults()拓展方法:
原本Host是不支持HTTP工作负载的,所以要使用此拓展方法可以配置主机所需要的Web服务。
调用这个方法会将WebHost注入到Host中。
简单来说,如果你的版本是3.0到5.0,且需要web服务,如MVC或者WebAPI则需要配置此服务。
(创造项目的时候会自动生成的,所以了解一下这个拓展方法是干什么的就好了)
ConfigureWebHostDefaults拓展方法源码
namespace Microsoft.Extensions.Hosting
{
// 用于托管 Web 应用程序的默认值配置 Microsoft.Extensions.Hosting.IHostBuilder
// 这应该在应用程序特定的配置之前调用,以避免它覆盖提供的服务、配置源、环境、内容根等
public static class GenericHostBuilderExtensions
{
public static IHostBuilder ConfigureWebHostDefaults(this IHostBuilder builder, Action<IWebHostBuilder> configure);
}
}
6.0版本的的创建泛型Host
6.0版本,NetCore使用最小托管模型来创建应用,只需要4行代码就能构建一个应用
通过使用WebApplication.CreateBuilder(args)
来创建主机
最小托管模型
// 得到应用构造器:WebApplicationBuilder
var builder = WebApplication.CreateBuilder(args);
// 配置日志
builder.Logging.AddLog4Net("ConfigFile/log4net.config");
// 得到应用:WebApplication
var app = builder.Build();
// 配置中间件
app.UseStaticFiles();
// 运行主机
app.Run();
3. 为什么要用泛型Host替换WebHost:
泛型Host在2.1版本就已经存在了,当时只是用于非Http请求的工作负载,而WebHost 构建器更多地与 HTTP 请求相关联并且适用于 Web 应用,随着微服务和Docker的发展和出现,程序需要一个更通用的 Web 主机,因此 .NET核心团队在3.0对Host进行了改进,让Host也可也支持HTTP负载(通过拓展方法ConfigureWebHostDefaults
),可以更好地将 ASP.NET Core 应用与非 Web 特定的其他服务器方案集成。简而言之就是为了在所有的netcore应用中都是用一个主机。
4. 从WebHost改为泛型Host后发生主要变化:
使用Host替换WebHost,即3.0之后的变化,主要在于依赖注入DI,在使用HostBuilder的时候,Startup.cs的构造函数只能注入以下类型:
IConfiguration:键值对的配置,如默认的appsetting.json文件中的配置,或者通过创建主机的时候使用
Builder.AddJsonFile()
方法引入的自定义json配置文件引入的json配置文件,通过这个接口可以获取配置文件的数据;IHostEnvironment:提供运行应用程序的宿主环境,比如常用的IsDevelopment()方法来判断是否是运行时环境;
IWebHostEnvironment:提供有关运行应用程序的 Web 托管环境的信息,可以获取比如可服务应用程序的文件的绝对路径,默认是wwwroot的子文件夹;
5.代码上的流程与实际逻辑详细流程对比(泛型主机)
代码上的流程:
Main方法中调用
CreateHostBuilder()
。CreateHostBuilder()
方法调用静态方法Host.CreateDefaultBuilder()
方法得到IHostBuilder
构造器 。配置系统所需服务和
ConfigureWebHostDefaults()
。返回
IHostBuilder
构造器。Main方法继续调用构造器的
Build()
方法 ->Run()
方法。
逻辑上的流程(源码):
Host.CreateDefaultBuilder()方法,配置基础服务,并返回IHostBuilder构造器:
创建一个
IHostBuilder接口
的HostBuilder实例
,根据4个方法来配置基础服务:1.1
ConfigureHostConfiguration()
配置主机配置。1.2
ConfigureLogging()
配置日志服务。1.3
ConfigureAppConfiguration()
配置系统配置appsetting.json和自定义配置文件。1.4
UseDefaultServiceProvider()
配置ServiceProvider()
依赖注入容器。ConfigureWebHostDefaults()注入WebHost,配置我们自己的服务和Http负载支持:
创建一个
WebHostBuilder
构造器,并调用4个方法来配置基础服务:2.1
UseKestrel()
配置Kestrel的服务器的应用。2.2
UseIIS()
配置对IIS进程内运行的调用,首先判断是不是windows,然后注册IISHttpServer
服务,会覆盖UseKestrel()
,UseIISIntegration()
对IIS进程外运行的调用。2.3
UseStart()
配置对于Startup.cs文件的引用,找到后,会先找到用Startup.cs里面的ConfigureService()
方法,然后使用Builder()
方法调用。2.4
services.AddHostedService<GenericWebHostService>()
,添加了一个IHostedService
服务。Build()方法,生成IHost的实例,并配置相关服务然后返回IHost:
比较重要的:
在这里会创建依赖注入容器,并依赖注入相关服务
Run()方法:
本质上是调用的
IHost.RunAsync()
-> 调用的是IHost.StartAsync()
,它的流程是:4.1 从容器中调用所有的
IHostService
服务,然后依次调用StartAsync()
包括
ConfigureWebHostDefaults()
中的WebHost
的StartAsync()
,包括Startup.cs
里面的Configuer()
方法来创建中间件。4.2 运行
拓展:
IHostService作用(6.0版本)
继承实现IHostService接口
中的StartAsync()
方法和StopAsync()
方法来管理应用启动和关闭事件,当然需要在Program.cs
文件中使用builder.Services.AddHostService<T>()
注入主机服务才会起作用;
ApplicationStart类源码
/// <summary>
/// 应用启动和关闭事件,也可也继承IApplicationLifetime
/// </summary>
public class ApplicationStart : IHostedService
{
/// <summary>
/// 应用启动
/// </summary>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public Task StartAsync(CancellationToken cancellationToken)
{
return Task.CompletedTask;
}
/// <summary>
/// 应用关闭
/// </summary>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public Task StopAsync(CancellationToken cancellationToken)
{
return Task.CompletedTask;
}
}
关于BackgroundService类(6.0版本)(后台运行服务)
BackgroundService类
也是继承于IHostService
,并增加了一个Task的任务属性,CancellationTokenSource
取消令牌属性和ExecuteTask()
方法来运行任务。通常用于WokerService服务的Woker
类,同样也是需要通过builder.Services.AddHostService<T>()
此方法来注入的主机服务中,以达到后台运行的目的;
主机--Host的更多相关文章
- virtual box设置网络,使用nat网络和仅主机(Host Only)网络进行连接
virtual box设置网络,使用nat网络和仅主机(Host Only)网络进行连接 前言 作为程序员难免要在本机电脑安装虚拟机,最近在用virtual box安装虚拟机的时候遇到了点问题. 对于 ...
- ASP.NET Core 5.0之默认主机Host.CreateDefaultBuilder
通过Rider调试的方式看了下ASP.NET Core 5.0的Web API默认项目,重点关注Host.CreateDefaultBuilder(args)中的执行过程,主要包括主机配置.应用程序配 ...
- [Docker]——container和主机(host)之间的文件拷贝
1. 从 container 到 主机(host) 使用 docker cp 命令 docker cp <containerId>:/file/path/within/container ...
- (八)分布式通信----主机Host
上节中有谈到的是通信主机(TransportHost),本节中主机(ServiceHost)负责管理服务的生命周期. 项目中将两个主机拆分开,实现不同的功能: 通信主机:用于启动通信监听端口: 生命周 ...
- tomcat原理(一)server.xml中的host虚拟主机的理解
一.Tomcat服务器端口的配置 Tomcat的所有配置都放在conf文件夹之中,里面的server.xml文件是配置的核心文件. 如果想修改Tomcat服务器的启动端口,则可以在server.xml ...
- ASP.NET Core技术研究-探秘Host主机启动过程
当我们将原有ASP.NET 应用程序升级迁移到ASP.NET Core之后,我们发现代码工程中多了两个类Program类和Startup类. 接下来我们详细探秘一下通用主机Host的启动过程. 一.P ...
- 通过Zabbix API实现对主机的增加(无主机资产的添加和带主机资产的添加)、删除、获取主机id、获取模板id、获取组id
config.yaml存储zabbix的信息(主要包括zabbix server的url .请求头部.登陆的用户名密码) Zabbix_Config: zabbix_url: http://192.1 ...
- Tomcat虚拟主机配置
3.1.配置虚拟主机 配置虚似主机就是配置一个网站. 在Tomcat服务器配置一个虚拟主机(网站),需要修改conf文件夹下的server.xml这个配置文件,使用Host元素进行配置,打开serve ...
- tomcat虚拟主机虚拟目录配置
今天着实要记上一笔,需要配置tomcat虚拟目录的问题 一 首先看两个名词 appBase -- 顾名思义 就是你app所在的目录,目录下面的子目录将自动被部署为应用:war被解压并部署 docBas ...
- Tomcat【介绍Tomcat、结构目录、虚拟目录、临时域名、虚拟主机、体系结构】
什么是Tomcat Tomcat简单的说就是一个运行JAVA的网络服务器,底层是Socket的一个程序,它也是JSP和Serlvet的一个容器. 为什么我们需要用到Tomcat 如果你学过html,c ...
随机推荐
- vivo 悟空活动中台 - 微组件状态管理(下)
本文首发于 vivo互联网技术 微信公众号 链接: https://mp.weixin.qq.com/s/1DzTYIExVbK0uE_Oc7IHYw作者:悟空中台研发团队 [悟空活动中台]系列往期精 ...
- 【有奖体验】叮!你有一张 3D 卡通头像请查收
立即体验基于函数计算部署[图生图]一键部署3D卡通风格模型: https://developer.aliyun.com/topic/aigc_fc 人工智能生成内容(Artificial Intell ...
- 云原生体系下 Serverless 弹性探索与实践
Serverless 时代的来临 Serverless 顾名思义,是一种"无服务器"架构,因为屏蔽了服务器的各种运维复杂度,让开发人员可以将更多精力用于业务逻辑设计与实现.在 Se ...
- 关于el-upload上传图片的一些坑clearFiles()的使用
https://blog.csdn.net/weixin_46421824/article/details/109195624?spm=1001.2101.3001.6661.1&utm_me ...
- uni-app 从入门到放弃(持续更新)
https://blog.csdn.net/weixin_33940102/article/details/91460204
- 第七届蓝桥杯大赛个人赛省赛(软件类)B组
3.凑算式 B DEFA + --- + ------- = 10 C GHI (如果显示有问题,可以参见[图1.jpg]) 这个算式中A~I代表1~9 ...
- spring注入的几种方式
本文为博主原创,未经允许不得转载: Spring注入有以下几种方式: 构造方法注入:通过构造方法实现依赖注入.在类的构造方法中使用@Autowired注解注入需要的依赖类. Setter方法注入:通过 ...
- 怎样实现WPF Prism Module的国际化和本地化?
怎样实现WPF Prism Module的国际化和本地化? English | 简体中文 上一篇有简单介绍主工程的国际化,使用的资源字典(XAML)实现的. 这几天我添加了几个Prism模块(Modu ...
- [转帖]十步解析awr报告
http://www.zhaibibei.cn/awr/1.1/ 从这期开始讲解awr报告的部分,首先讲解awr整体的部分 后续会针对不同的点进行讲解 1. 数据库细节 这部分可以看到 数据库的版本 ...
- [转帖]vSphere虚拟化平台(vCenter和ESXi)升级注意事项
https://www.dinghui.org/vmware-vsphere-upgrade.html 最近两年做了蛮多vSphere升级项目,几点思路,做一下汇总整理如下供参考: 一.升级必要性 1 ...