ASP.NET Core中的主机IHostBuilder
此文是在官方文档的基础上做的个人笔记,一些简单的内容就没用再列出来了,参考官方文档:https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/host/generic-host?view=aspnetcore-5.0
主机封装了应用的所有资源,例如:
- HTTP服务器实现(Kestrel)
- 中间件
- Logging
- DI
- Configuration
IHostedService
,可以实现执行后台任务的功能
主机分为两种:
- .Net 通用主机
IHostBuilder
:也称为泛型主机**(推荐使用)**。
Program.cs
的CreateDefaultBuilder
和ConfigureWebHostDefaults
方法为主机配置了一组默认选项包括:- 将Kestrel作为默认的web服务器并启用与IIS的集成
- 从
appsettings.json
、appsettings.{environment name}.json
、环境变量、命令行参数等其它配置项中加载配置。
- asp.net core web主机
IWebHostbuilder
:仅用于后向兼容性asp.ner core 1.0 2.0
1. 主机服务
框架会自动注册以下服务:
IHostApplicationLifetime
IHostLifetime
IHostEnvironment
/IWebHostEnvironment
1.1 ★使用IHostApplicationLifetime
执行后台任务★
可以将IHostApplicationLifetime
服务注入任何类以处理启动后和正常关闭任务。
下面我们创建一个类LifetimeEventsHostedService
实现IHostedService
接口。
internal class LifetimeEventsHostedService : IHostedService
{private readonly ILogger _logger;private readonly IHostApplicationLifetime _appLifetime;public LifetimeEventsHostedService(ILogger<LifetimeEventsHostedService> logger, IHostApplicationLifetime 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.");}private void OnStopping(){_logger.LogInformation("OnStopping has been called.");}private void OnStopped(){_logger.LogInformation("OnStopped has been called.");}
}
注册服务,两种方式都可以:
builder.Services.AddHostedService<LifetimeEventsHostedService>();
builder.Services.AddTransient<IHostedService, LifetimeEventsHostedService>();
1.2 IHostApplicationLifetime
vs IHostedService
vs BackgroudService
如果仔细观察的话,会发现这两个接口和抽象类很像。
- IHostedService:
StartAsync
、StopAsync
- IHostApplicationLifetime:
ApplicationStarted
、ApplicationStopping
、ApplicationStopped
- BackgroudService:
ExecuteAsync
你可以实现IHostedService
接口或BackgroudService
抽象类来执行后台任务。
BackgroundService
是IHostedService
的一个实现类,用来执行耗时的后台任务。
你也可以直接实现IHostedSerivice
接口,来执行简单的后台任务。
IHostApplicationLifetime
粒度更精细一些,可以在应用启动之后执行,停止过程中/后执行。这些都是IHostedService
所没有的。微软对二者做了这样的区分,我感觉可能是Host里除了Application可能还有些其他事情需要处理。 不过我们一般不主动去实现这个接口,使用方法参考上面的示例。
1.3 IHostLifetime
用来控制主机何时启动和何时停止。 当注册了多个实现时,仅最后一个有效。
Microsoft.Extensions.Hosting.Internal.ConsoleLifetime
是默认的IHostLifetime
实现,用来
- 侦听
Ctrl+C/SIGINT
或 SIGTERM 并调用 StopApplication 来启动关闭进程。 - 解除阻止
RunAsync
和WaitForShutdownAsync
等扩展。
2. 配置主机
如果感觉框架对主机的默认配置不合理,可以调用IHostBuilder
的ConfigureHostConfiguration
和ConfigureAppConfiguration
用来自定义配置主机和应用。比如可以加载额外的json文件,设置BasePath等。
3. 适用于Web应用的一些配置
如:UseUrls
、PreferHostingUrls
、UseStartup
、UseWebRoot
、UseSettings
等。
参考:https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/host/generic-host?view=aspnetcore-5.0#settings-for-web-apps
4. 主机生存周期
可以调用IHost
对象的Run
、RunAsync
、RunConsoleAsync
、Start
、Stop
、WaitForShutdown
等方法
5. Web主机
https://stackoverflow.com/questions/52085806/what-is-the-difference-between-iwebhost-webhostbuilder-buildwebhost
参考:
在 ASP.NET Core 中使用托管服务实现后台任务
ASP.NET Core中的主机IHostBuilder相关推荐
- 在 ASP.NET Core 中使用托管服务实现后台任务
在 ASP.NET Core 中,后台任务作为托管服务实现.托管服务是一个类,具有实现 IHostedService 接口的后台任务逻辑. ASP.NET Core 辅助角色服务模板可作为编写长期服务 ...
- 在asp.net core中使用托管服务实现后台任务
在业务场景中经常需要后台服务不停的或定时处理一些任务,这些任务是不需要及时响应请求的. 在 asp.net中会使用windows服务来处理. 在 asp.net core中,可以使用托管服务来实现,托 ...
- 如何在 ASP.Net Core 中使用 HTTP.sys WebServer ?
ASP.Net Core 是一个开源的,跨平台的,轻量级模块化框架,可用它来构建高性能的Web程序,大家都知道 Kestrel 是 ASP.Net Core 内置的跨平台web服务器,但是它有一定的局 ...
- 如何在 ASP.Net Core 中使用 Lamar
ASP.Net Core 自带了一个极简的 开箱即用 的依赖注入容器,实际上,你还可以使用第三方的 依赖注入容器 来替代它,依赖注入是一种设计模式,它能够有效的实现对象之间的解耦并有利于提高单元测试和 ...
- 如何在 ASP.Net Core 中使用 Serilog
记录日志的一个作用就是方便对应用程序进行跟踪和排错调查,在实际应用上都是引入 日志框架,但如果你的 日志文件 包含非结构化的数据,那么查询起来将是一个噩梦,所以需要在记录日志的时候采用结构化方式. 将 ...
- 如何在ASP.NET Core中使用SignalR构建与Angular通信的实时通信应用程序
图片 假设我们要创建一个监视Web应用程序,该应用程序为用户提供了一个能够显示一系列信息的仪表板,这些信息会随着时间的推移而更新. 第一种方法是在定义的时间间隔(轮询)定期调用API 以更新仪表板上的 ...
- ASP.NET Core 中的管道机制
首先,很感谢在上篇文章 C# 管道式编程 中给我有小额捐助和点赞的朋友们,感谢你们的支持与肯定.希望我的每一次分享都能让彼此获得一些收获,当然如果我有些地方叙述的不正确或不当,还请不客气的指出.好了, ...
- ASP.NET Core 中使用IHttpClientFactory发出HTTP请求
1.HttpClient类使用存在的问题 HttpClient类的使用所存在的问题,百度搜索的文章一大堆,好多都是单纯文字描述,让人感觉不太好理解,为了更好理解HttpClient使用存在的问题,下面 ...
- ASP.NET Core 中的静态文件
1.前言 当我们创建Core项目的时候,Web根目录下会有个wwwroot文件目录,wwwroot文件目录里面默认有HTML.CSS.IMG.JavaScript等文件,而这些文件都是Core提供给客 ...
最新文章
- 这一年,信息技术领域上演的“断舍离”
- java中四种引用类型(对象的强、软、弱和虚引用)
- java 6 26_WebSphere7.0 Java6.26安装
- python协程池操作mysql_python_协程方式操作数据库
- 【转】EF三种编程方式的区别Database first ,Model first ,code first
- 移动端与PC端页面布局区别
- 数据预处理-数据变换-小波变换
- 编译原理课程作业-Cminus语言的词法及语法分析器实现
- 数据治理将遇到哪些问题
- 软件开发之韵:和谐敏捷
- 学生管理系统java源代码_java学生管理系统源代码
- c语言 控制电脑程序,c语言程序设计
- 西门子g120变频器接线图_西门子变频器G120如何通过速度限幅来避免飞车的发生...
- lte网络测试用什么软件,LTE_测试软件使用教程.doc
- pyhton根据城市名称获取省份名称
- qemu的详细资料大全(入门必看!!!)
- oracle+clod+和bolb,Azure存储Blob类型(CloudBlobContainer,CloudBlobClient等)和线程安全
- 【NISP一级】2.2 身份鉴别与访问控制
- 【MD】markdown符号表
- 利用CANoe Vector LDF Explorer Pro创建LDF文件
热门文章
- 浪潮服务器kvm安装系统2021,浪潮服务器KVMoverIP使用方法
- 显卡发展史:从百花齐放到双雄争霸,显卡为何如此「迷人」?
- java web搜索引擎优化_搜索引擎优化(SEO)与网站开发优化
- python 常见基础命令
- PB中小写金额转换成大写金额(发票类型)
- java单词接龙,百度2016年暑期实习生笔试题 —— 单词接龙
- 微信小程序 滑块视图容器
- java做的企业网站源码 java开发的公司网站源码 java ssm框架开发的门户网站源码 java 企业官网源代码公司门户网站模板源码带后台SSM框架开发建设
- 关于天气后报网站的天气数据采集(以北上广深2020年为例)以及数据可视化
- 程序员的内涵之基于SDK的Windows应用程序框架代码详解