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.
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地址:
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()); 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, ); return Task.CompletedTask;
} public void Dispose()
{
_timer?.Dispose();
}
}
-- hostsettings.json文件
{
"environment": "Development"
}
参考文献:
官方文档:ASP.NET Core 通用主机
asp.net core 系列 17 通用主机 IHostBuilder的更多相关文章
- asp.net core 3.x 通用主机原理及使用
一.前言 只是讲asp.net core 3.x通用主机的大致原理,这些东西是通过查看源码以及自己根据经验总结得来的,在文章中不会深入源码,因为个人觉得懂原理就晓得扩展点,后期碰到有需求的时候再仔细去 ...
- asp.net core 3.x 通用主机是如何承载asp.net core的-上
一.前言 上一篇<asp.net core 3.x 通用主机原理及使用>扯了下3.x中的通用主机,刚好有哥们写了篇<.NET Core 3.1和WorkerServices构建Win ...
- asp.net core 系列 16 Web主机 IWebHostBuilder
一.概述 在asp.net core中,Host主机负责应用程序启动和生存期管理.host主机包括Web 主机(IWebHostBuilder)和通用主机(IHostBuilder).Web 主机是适 ...
- 翻译 - ASP.NET Core 基本知识 - 通用主机 (Generic Host)
翻译自 https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/generic-host?view=aspnetcore-5.0 ...
- 【目录】asp.net core系列篇
随笔分类 - asp.net core系列篇 asp.net core系列 68 Filter管道过滤器 摘要: 一.概述 本篇详细了解一下asp.net core filters,filter叫&q ...
- asp.net core系列 39 Web 应用Razor 介绍与详细示例
一. Razor介绍 在使用ASP.NET Core Web开发时, ASP.NET Core MVC 提供了一个新特性Razor. 这样开发Web包括了MVC框架和Razor框架.对于Razor来说 ...
- asp.net core系列 39 Razor 介绍与详细示例
原文:asp.net core系列 39 Razor 介绍与详细示例 一. Razor介绍 在使用ASP.NET Core Web开发时, ASP.NET Core MVC 提供了一个新特性Razor ...
- 技术的正宗与野路子 c#, AOP动态代理实现动态权限控制(一) 探索基于.NET下实现一句话木马之asmx篇 asp.net core 系列 9 环境(Development、Staging 、Production)
黄衫女子的武功似乎与周芷若乃是一路,飘忽灵动,变幻无方,但举手抬足之间却是正而不邪,如说周芷若形似鬼魅,那黄衫女子便是态拟神仙. 这段描写出自<倚天屠龙记>第三十八回. “九阴神抓”本是& ...
- WPF中的常用布局 栈的实现 一个关于素数的神奇性质 C# defualt关键字默认值用法 接口通俗理解 C# Json序列化和反序列化 ASP.NET CORE系列【五】webapi整理以及RESTful风格化
WPF中的常用布局 一 写在开头1.1 写在开头微软是一家伟大的公司.评价一门技术的好坏得看具体的需求,没有哪门技术是面面俱到地好,应该抛弃对微软和微软的技术的偏见. 1.2 本文内容本文主要内容 ...
随机推荐
- Python学习最佳路线图
python语言基础(1)Python3入门,数据类型,字符串(2)判断/循环语句,函数,命名空间,作用域(3)类与对象,继承,多态(4)tkinter界面编程(5)文件与异常,数据处理简介(6)Py ...
- 微信小程序支付遇到的坑
1,微信公众号支付和微信小程序支付有差异 微信公众号:可以直接跳转走h5的微信支付 微信小程序:在测试环境.沙箱环境使用微信公众号的跳转支付没有问题,在线上存在支付异常 最后商讨的解决方法 openi ...
- windows部署Apollo
前言 配置中心伴随着这几年分布式系统演变和微服务架构的兴起,已经成为必不可少的需求之一.试下一下如果哪天公司的所有应用服务,从公司服务器迁移到云服务,成千上万的配置,修改起来是多么耗时费劲的事(我们公 ...
- Xcode 10.1 运行老版本工程遇到问题解决记录
近来接手公司一个历史遗留项目进行修改.上线工作,想想我都近三年没敲过iOS代码了也是慌.. 项目大致情况: 18年年初应上线项目,各种情况下一直搁置,到18年底了要重启上线,原来开发人员离职了都,年底 ...
- CF719E. Sasha and Array [线段树维护矩阵]
CF719E. Sasha and Array 题意: 对长度为 n 的数列进行 m 次操作, 操作为: a[l..r] 每一项都加一个常数 C, 其中 0 ≤ C ≤ 10^9 求 F[a[l]]+ ...
- LINUX监控-spotlight
这里连接的user不能是root(spotlight需要一个具有root权限的用户,但是又不允许是root),所以需要给要连接的linux端创建一个有root权限的用户,在linux主机创建了root ...
- [Educational Round 59][Codeforces 1107G. Vasya and Maximum Profit]
咸鱼了好久...出来冒个泡_(:з」∠)_ 题目连接:1107G - Vasya and Maximum Profit 题目大意:给出\(n,a\)以及长度为\(n\)的数组\(c_i\)和长度为\( ...
- tp5生成6位不重复验证码
/** * 获取激活码 */ public function getnum() { $time = Db::name('fangchan_jihuoma')->group('id desc')- ...
- C# 使用WinApi操作剪切板Clipboard
前言: 最近正好写一个程序,需要操作剪切板 功能很简单,只需要从剪切板内读取字符串,然后清空剪切板,然后再把字符串导入剪切板 我想当然的使用我最拿手的C#来完成这项工作,原因无他,因为.Net框架封装 ...
- powerdesigner 不能自动生成注释的解决方法(三步解决)
解决power designer 不能自动生成注释的解决办法只需要3步: 一.快捷键 Ctrl+Shift+X 打开脚本编辑器:(快捷键不能执行的话可以从这个路径执行:Tools --> Exc ...