此文是在官方文档的基础上做的个人笔记,一些简单的内容就没用再列出来了,参考官方文档: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.csCreateDefaultBuilderConfigureWebHostDefaults方法为主机配置了一组默认选项包括:

    1. 将Kestrel作为默认的web服务器并启用与IIS的集成
    2. appsettings.jsonappsettings.{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: StartAsyncStopAsync
  • IHostApplicationLifetime:ApplicationStartedApplicationStoppingApplicationStopped
  • BackgroudService:ExecuteAsync

你可以实现IHostedService接口或BackgroudService抽象类来执行后台任务。

BackgroundServiceIHostedService的一个实现类,用来执行耗时的后台任务。

你也可以直接实现IHostedSerivice接口,来执行简单的后台任务。

IHostApplicationLifetime粒度更精细一些,可以在应用启动之后执行,停止过程中/后执行。这些都是IHostedService所没有的。微软对二者做了这样的区分,我感觉可能是Host里除了Application可能还有些其他事情需要处理。 不过我们一般不主动去实现这个接口,使用方法参考上面的示例。

1.3 IHostLifetime

用来控制主机何时启动和何时停止。 当注册了多个实现时,仅最后一个有效。

Microsoft.Extensions.Hosting.Internal.ConsoleLifetime 是默认的IHostLifetime 实现,用来

  • 侦听 Ctrl+C/SIGINT 或 SIGTERM 并调用 StopApplication 来启动关闭进程。
  • 解除阻止 RunAsyncWaitForShutdownAsync 等扩展。

2. 配置主机

如果感觉框架对主机的默认配置不合理,可以调用IHostBuilderConfigureHostConfigurationConfigureAppConfiguration用来自定义配置主机和应用。比如可以加载额外的json文件,设置BasePath等。

3. 适用于Web应用的一些配置

如:UseUrlsPreferHostingUrlsUseStartupUseWebRootUseSettings等。

参考:https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/host/generic-host?view=aspnetcore-5.0#settings-for-web-apps

4. 主机生存周期

可以调用IHost对象的RunRunAsyncRunConsoleAsyncStartStopWaitForShutdown等方法

5. Web主机

https://stackoverflow.com/questions/52085806/what-is-the-difference-between-iwebhost-webhostbuilder-buildwebhost


参考:
在 ASP.NET Core 中使用托管服务实现后台任务

ASP.NET Core中的主机IHostBuilder相关推荐

  1. 在 ASP.NET Core 中使用托管服务实现后台任务

    在 ASP.NET Core 中,后台任务作为托管服务实现.托管服务是一个类,具有实现 IHostedService 接口的后台任务逻辑. ASP.NET Core 辅助角色服务模板可作为编写长期服务 ...

  2. 在asp.net core中使用托管服务实现后台任务

    在业务场景中经常需要后台服务不停的或定时处理一些任务,这些任务是不需要及时响应请求的. 在 asp.net中会使用windows服务来处理. 在 asp.net core中,可以使用托管服务来实现,托 ...

  3. 如何在 ASP.Net Core 中使用 HTTP.sys WebServer ?

    ASP.Net Core 是一个开源的,跨平台的,轻量级模块化框架,可用它来构建高性能的Web程序,大家都知道 Kestrel 是 ASP.Net Core 内置的跨平台web服务器,但是它有一定的局 ...

  4. 如何在 ASP.Net Core 中使用 Lamar

    ASP.Net Core 自带了一个极简的 开箱即用 的依赖注入容器,实际上,你还可以使用第三方的 依赖注入容器 来替代它,依赖注入是一种设计模式,它能够有效的实现对象之间的解耦并有利于提高单元测试和 ...

  5. 如何在 ASP.Net Core 中使用 Serilog

    记录日志的一个作用就是方便对应用程序进行跟踪和排错调查,在实际应用上都是引入 日志框架,但如果你的 日志文件 包含非结构化的数据,那么查询起来将是一个噩梦,所以需要在记录日志的时候采用结构化方式. 将 ...

  6. 如何在ASP.NET Core中使用SignalR构建与Angular通信的实时通信应用程序

    图片 假设我们要创建一个监视Web应用程序,该应用程序为用户提供了一个能够显示一系列信息的仪表板,这些信息会随着时间的推移而更新. 第一种方法是在定义的时间间隔(轮询)定期调用API 以更新仪表板上的 ...

  7. ASP.NET Core 中的管道机制

    首先,很感谢在上篇文章 C# 管道式编程 中给我有小额捐助和点赞的朋友们,感谢你们的支持与肯定.希望我的每一次分享都能让彼此获得一些收获,当然如果我有些地方叙述的不正确或不当,还请不客气的指出.好了, ...

  8. ASP.NET Core 中使用IHttpClientFactory发出HTTP请求

    1.HttpClient类使用存在的问题 HttpClient类的使用所存在的问题,百度搜索的文章一大堆,好多都是单纯文字描述,让人感觉不太好理解,为了更好理解HttpClient使用存在的问题,下面 ...

  9. ASP.NET Core 中的静态文件

    1.前言 当我们创建Core项目的时候,Web根目录下会有个wwwroot文件目录,wwwroot文件目录里面默认有HTML.CSS.IMG.JavaScript等文件,而这些文件都是Core提供给客 ...

最新文章

  1. 这一年,信息技术领域上演的“断舍离”
  2. java中四种引用类型(对象的强、软、弱和虚引用)
  3. java 6 26_WebSphere7.0 Java6.26安装
  4. python协程池操作mysql_python_协程方式操作数据库
  5. 【转】EF三种编程方式的区别Database first ,Model first ,code first
  6. 移动端与PC端页面布局区别
  7. 数据预处理-数据变换-小波变换
  8. 编译原理课程作业-Cminus语言的词法及语法分析器实现
  9. 数据治理将遇到哪些问题
  10. 软件开发之韵:和谐敏捷
  11. 学生管理系统java源代码_java学生管理系统源代码
  12. c语言 控制电脑程序,c语言程序设计
  13. 西门子g120变频器接线图_西门子变频器G120如何通过速度限幅来避免飞车的发生...
  14. lte网络测试用什么软件,LTE_测试软件使用教程.doc
  15. pyhton根据城市名称获取省份名称
  16. qemu的详细资料大全(入门必看!!!)
  17. oracle+clod+和bolb,Azure存储Blob类型(CloudBlobContainer,CloudBlobClient等)和线程安全
  18. 【NISP一级】2.2 身份鉴别与访问控制
  19. 【MD】markdown符号表
  20. 利用CANoe Vector LDF Explorer Pro创建LDF文件

热门文章

  1. 浪潮服务器kvm安装系统2021,浪潮服务器KVMoverIP使用方法
  2. 显卡发展史:从百花齐放到双雄争霸,显卡为何如此「迷人」?
  3. java web搜索引擎优化_搜索引擎优化(SEO)与网站开发优化
  4. python 常见基础命令
  5. PB中小写金额转换成大写金额(发票类型)
  6. java单词接龙,百度2016年暑期实习生笔试题 —— 单词接龙
  7. 微信小程序 滑块视图容器
  8. java做的企业网站源码 java开发的公司网站源码 java ssm框架开发的门户网站源码 java 企业官网源代码公司门户网站模板源码带后台SSM框架开发建设
  9. 关于天气后报网站的天气数据采集(以北上广深2020年为例)以及数据可视化
  10. 程序员的内涵之基于SDK的Windows应用程序框架代码详解