asp.net core 系列 17 通用主机 IHostBuilder
一.概述
ASP.NET Core 通用主机 (HostBuilder),该主机对于托管不处理 HTTP 请求的应用非常有用。通用主机的目标是将 HTTP 管道从 Web 主机 API 中分离出来,从而启用更多的主机方案。 基于通用主机的消息、后台任务和其他非 HTTP 工作负载可从横切功能(如配置、依赖关系注入 [DI] 和日志记录)中受益。通用主机是 ASP.NET Core 2.1 中的新增功能,不适用于 Web 承载方案。通用主机正处于开发阶段,用于在未来版本中替换 Web 主机,并在 HTTP 和非 HTTP 方案中充当主要的主机 API。
通用主机库位于 Microsoft.Extensions.Hosting 命名空间中,而web主机库位于Microsoft.AspNetCore.Hosting命令空间中。
PM> Install-Package Microsoft.AspNetCore.Hosting.Abstractions -Version 2.2.0
1.1 设置主机
IHostBuilder 是供库和应用初始化、生成和运行主机的主要组件。(官方文档中main方法是使用的异步,但本人vs程序启动时提示找不到mian方法,只好改成了同步) 。
public static void Main(string[] args){var host = new HostBuilder().Build();host.Run();}
1.2 默认服务
在主机初始化期间注册以下服务:
环境 (IHostingEnvironment)
HostBuilderContext
配置 (IConfiguration)
IApplicationLifetime (ApplicationLifetime)
IHostLifetime (ConsoleLifetime)
IHost
选项 (AddOptions)
日志记录 (AddLogging)
1.3 主机配置 ConfigureHostConfiguration
主机配置的创建方式如下:
调用 IHostBuilder 上的扩展方法以设置“内容根”和“环境”。
从 ConfigureHostConfiguration 中的配置提供程序读取配置。
(1) ConfigureHostConfiguration 主机配置
通用主机配置与web主机配置还是有些区别,在通用主机中有ConfigureHostConfiguration用来配置主机。主机配置用于初始化 IHostingEnvironment,以供在应用的构建过程中使用。可多次调用 ConfigureHostConfiguration
,并得到累计结果。必须在 ConfigureHostConfiguration
中显式指定应用所需的任何配置提供程序,包括:
1)文件配置(例如,来自 hostsettings.json 文件)。
2)环境变量配置。
3)命令行参数配置。
4)任何其他所需的配置提供程序。
通过使用 SetBasePath 指定应用的基本路径,然后调用其中一个文件配置提供程序,可以启用主机的文件配置。
(2) AddEnvironmentVariables 环境变量
要添加主机的环境变量配置,请在主机生成器上调用 AddEnvironmentVariables。 示例应用使用前缀 PREFIX_
。 当系统读取环境变量时,便会删除前缀。 配置示例应用的主机后,PREFIX_ENVIRONMENT
的环境变量值就变成 environment
密钥的主机配置值。
(3) AddCommandLine 命令行参数
通过 dotnet run
运行应用 指定参数时,通过调用 AddCommandLine 可添加命令行配置。
1.4 应用配置 ConfigureAppConfiguration
调用 ConfigureAppConfiguration 创建应用配置,在web主机中也有介绍。这里就不再说明。 主机配置和应用配置都可以做配置使用,主机配置重点在主机环境的配置(IHostingEnvironment)。
1.5 ConfigureServices
ConfigureServices 将服务添加到应用的依赖关系注入容器。 可多次调用 ConfigureServices,并得到累计结果。这个在web主机中常用。 值得注意的是:除了三种注入的实例生命周期(asp.net core 系列 4 注入服务的生存期)。还可以注入THostedService类型服务,专门用于做后台服务的。
var host = new HostBuilder().ConfigureServices((hostContext, services) =>{if (hostContext.HostingEnvironment.IsDevelopment()){// Development service configuration }else{// Non-development service configuration }services.AddHostedService<LifetimeEventsHostedService>();services.AddHostedService<TimedHostedService>();})
1.6 IApplicationLifetime 接口
IApplicationLifetime接口在上篇介绍web主机进有讲过,这里不在具体介绍。下面会有代码演示,实现一个IHostedService类型服务,在服务中用于注册事件。
二. 完整示例
使用通用主机来演示一个后台服务。使用控制台做宿主,后台服务定时每隔5秒执行一次。该演示包括主机配置、应用配置、服务容器注入、日志配置。还包括注入二个IHostedService类型的服务。其中TimedHostedService类用于做后台定时服务,LifetimeEventsHostedService类注入服务IApplicationLifetime事件,监听服务运行状态。
完整示例github地址:
https://github.com/aspnet/Docs/tree/master/aspnetcore/fundamentals/host/generic-host/samples/2.x/GenericHostSample
public class Program{/// <summary>/// 使用控制台做承载的后台服务/// </summary>/// <param name="args"></param>public static void Main(string[] args){var host = new HostBuilder().ConfigureHostConfiguration(configHost =>{configHost.SetBasePath(Directory.GetCurrentDirectory());configHost.AddJsonFile("hostsettings.json", optional: true);configHost.AddEnvironmentVariables(prefix: "PREFIX_");configHost.AddCommandLine(args);}).ConfigureAppConfiguration((hostContext, configApp) =>{configApp.AddJsonFile("appsettings.json", optional: true);configApp.AddJsonFile($"appsettings.{hostContext.HostingEnvironment.EnvironmentName}.json",optional: true);configApp.AddEnvironmentVariables(prefix: "PREFIX_");configApp.AddCommandLine(args);}).ConfigureServices((hostContext, services) =>{//注册后台普通服务// services.AddSingleton<IJobTimeService, JobTimeService>();//注册后台THostedService类型服务services.AddHostedService<LifetimeEventsHostedService>();services.AddHostedService<TimedHostedService>();}).ConfigureLogging((hostContext, configLogging) =>{configLogging.AddConsole();configLogging.AddDebug();}).UseConsoleLifetime().Build();//实例化注入的普通服务// IJobTimeService job = host.Services.GetRequiredService<IJobTimeService>();// job.Time(); host.Run();} }
/// <summary>///监听服务运行状态/// </summary>internal class LifetimeEventsHostedService : IHostedService{private readonly ILogger _logger;private readonly IApplicationLifetime _appLifetime;public LifetimeEventsHostedService(ILogger<LifetimeEventsHostedService> logger, IApplicationLifetime appLifetime){_logger = logger;_appLifetime = appLifetime;}public Task StartAsync(CancellationToken cancellationToken){_appLifetime.ApplicationStarted.Register(OnStarted);_appLifetime.ApplicationStopping.Register(OnStopping);_appLifetime.ApplicationStopped.Register(OnStopped);return Task.CompletedTask;}public Task StopAsync(CancellationToken cancellationToken){return Task.CompletedTask;}private void OnStarted(){_logger.LogInformation("OnStarted has been called.");// Perform post-startup activities here }private void OnStopping(){_logger.LogInformation("OnStopping has been called.");// Perform on-stopping activities here }private void OnStopped(){_logger.LogInformation("OnStopped has been called.");// Perform post-stopped activities here }}
/// <summary>/// 后台定时服务/// </summary>internal class TimedHostedService : IHostedService, IDisposable{private readonly ILogger _logger;private Timer _timer;public TimedHostedService(ILogger<TimedHostedService> logger){_logger = logger;}public Task StartAsync(CancellationToken cancellationToken){_logger.LogInformation("Timed Background Service is starting.");_timer = new Timer(DoWork, null, TimeSpan.Zero,TimeSpan.FromSeconds(5));return Task.CompletedTask;}/// <summary>/// 每隔5秒执行一次/// </summary>/// <param name="state"></param>private void DoWork(object state){_logger.LogInformation("Timed Background Service is working.");}public Task StopAsync(CancellationToken cancellationToken){_logger.LogInformation("Timed Background Service is stopping.");_timer?.Change(Timeout.Infinite, 0);return Task.CompletedTask;}public void Dispose(){_timer?.Dispose();}}
-- hostsettings.json文件 {"environment": "Development" }
参考文献:
官方文档:ASP.NET Core 通用主机
转载于:https://www.cnblogs.com/MrHSR/p/10320694.html
asp.net core 系列 17 通用主机 IHostBuilder相关推荐
- .NET Core 3.1通用主机原理及使用
一.前言 只是讲asp.net core 3.x通用主机的大致原理,这些东西是通过查看源码以及自己根据经验总结得来的,在文章中不会深入源码,因为个人觉得懂原理就晓得扩展点,后期碰到有需求的时候再仔细去 ...
- asp.net core 系列 18 web服务器实现
一. ASP.NET Core Module 在介绍ASP.NET Core Web实现之前,先来了解下ASP.NET Core Module.该模块是插入 IIS 管道的本机 IIS 模块(本机是指 ...
- asp向不同的用户发送信息_【asp.net core 系列】 1 带你了解一下asp.net core
0. 前言 这是一个新的系列,名字是<http://ASP.NET Core 入门到实战>.这个系列主讲http://ASP.NET Core MVC,辅助一些前端的基础知识(能用来实现我 ...
- 5.3Role和Claims授权「深入浅出ASP.NET Core系列」
5.3Role和Claims授权「深入浅出ASP.NET Core系列」 原文:5.3Role和Claims授权「深入浅出ASP.NET Core系列」 希望给你3-5分钟的碎片化学习,可能是坐地铁. ...
- 4.1ASP.NET Core请求过程「深入浅出ASP.NET Core系列」
原文:4.1ASP.NET Core请求过程「深入浅出ASP.NET Core系列」 希望给你3-5分钟的碎片化学习,可能是坐地铁.等公交,积少成多,水滴石穿,谢谢关注. HTTP请求过程 这里展示整 ...
- asp.net core系列 38 WebAPI 返回类型与响应格式--必备
一.返回类型 ASP.NET Core 提供以下 Web API Action方法返回类型选项,以及说明每种返回类型的最佳适用情况: (1) 固定类型 (2) IActionResult (3) Ac ...
- 5.1基于JWT的认证和授权「深入浅出ASP.NET Core系列」
原文:5.1基于JWT的认证和授权「深入浅出ASP.NET Core系列」 希望给你3-5分钟的碎片化学习,可能是坐地铁.等公交,积少成多,水滴石穿,码字辛苦,如果你吃了蛋觉得味道不错,希望点个赞,谢 ...
- ASP.NET CORE系列【一】搭建ASP.NET CORE项目
原文:ASP.NET CORE系列[一]搭建ASP.NET CORE项目 为什么要使用 ASP.NET Core? NET Core 刚发布的时候根据介绍就有点心里痒痒,微软的尿性都懂的,新东西bug ...
- .ne中的控制器循环出来的数据如何显示在视图上_【asp.net core 系列】3 视图以及视图与控制器...
0.前言 在之前的几篇中,我们大概介绍了如何创建一个http://asp.net core mvc项目以及http请求如何被路由转交给对应的执行单元.这一篇我们将介绍一下控制器与视图直接的关系. 1. ...
最新文章
- layui一个表格中怎么接两个接口的值_layer学习笔记之table表格引入数据实现分页...
- python从零实习深度学习_月薪45K的深度程序员教你从零在Python中开发深度学习
- Servlet / Tomcat / Spring 之间的关系
- NameServer的总控逻辑
- batocera游戏整合包_FIFAol3头像包整合
- ztree在刷新时第一个父节点消失_从反向传播推导到梯度消失and爆炸的原因及解决方案(从DNN到RNN,内附详细反向传播公式推导)...
- android.mk 冒号,android学习-ndk-build(androidstudio编译cocos2d-x库的cpp为so文件的解释)
- springboot 使用mybatis-plus 配置乐观锁
- 2021 年押宝哪个后端语言呢?
- 无法写入最后一个_手机资讯:iPhone 扩容机能否进行刷机刷机后无法激活怎么办...
- vmpalyer虚拟机的使用教程,小白也能看懂
- Linux下安装海康威视工业相机客户端
- 【通信电子电路】谐振功率放大电路multisim仿真
- Theano入门神经网络(三)
- 多目标人工秃鹫优化算法(MATLAB源码分享,智能优化算法) 提出了一种多目标版本的人工秃鹫优化算法(AVOA)
- mysql高级教程(一)
- python pandas 增加一列_Python之pandas新增列
- linux服务器重启日志,Linux系统最近重启时间、错误日志
- 服务器监控cacti
- Nodejs教程笔记(五)fs续 读取 写入 管道流
热门文章
- shell脚本----for循环-转 Syntax error: Bad for loop variable
- ubuntu ftp server-转
- Perl用LWP实现GET/POST数据发送 原
- Perl 模块 Getopt::Std 和 Getopt::Long
- Oracle中Sequence序列的使用
- JBoss 目录结构解释
- 使用shell测试cdn状态
- 轻松实现SQL异地备份
- C++ 作用域与生命周期
- nvarchar,nchar,vchar,nvchar,char…