一.概述

  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相关推荐

  1. .NET Core 3.1通用主机原理及使用

    一.前言 只是讲asp.net core 3.x通用主机的大致原理,这些东西是通过查看源码以及自己根据经验总结得来的,在文章中不会深入源码,因为个人觉得懂原理就晓得扩展点,后期碰到有需求的时候再仔细去 ...

  2. asp.net core 系列 18 web服务器实现

    一. ASP.NET Core Module 在介绍ASP.NET Core Web实现之前,先来了解下ASP.NET Core Module.该模块是插入 IIS 管道的本机 IIS 模块(本机是指 ...

  3. asp向不同的用户发送信息_【asp.net core 系列】 1 带你了解一下asp.net core

    0. 前言 这是一个新的系列,名字是<http://ASP.NET Core 入门到实战>.这个系列主讲http://ASP.NET Core MVC,辅助一些前端的基础知识(能用来实现我 ...

  4. 5.3Role和Claims授权「深入浅出ASP.NET Core系列」

    5.3Role和Claims授权「深入浅出ASP.NET Core系列」 原文:5.3Role和Claims授权「深入浅出ASP.NET Core系列」 希望给你3-5分钟的碎片化学习,可能是坐地铁. ...

  5. 4.1ASP.NET Core请求过程「深入浅出ASP.NET Core系列」

    原文:4.1ASP.NET Core请求过程「深入浅出ASP.NET Core系列」 希望给你3-5分钟的碎片化学习,可能是坐地铁.等公交,积少成多,水滴石穿,谢谢关注. HTTP请求过程 这里展示整 ...

  6. asp.net core系列 38 WebAPI 返回类型与响应格式--必备

    一.返回类型 ASP.NET Core 提供以下 Web API Action方法返回类型选项,以及说明每种返回类型的最佳适用情况: (1) 固定类型 (2) IActionResult (3) Ac ...

  7. 5.1基于JWT的认证和授权「深入浅出ASP.NET Core系列」

    原文:5.1基于JWT的认证和授权「深入浅出ASP.NET Core系列」 希望给你3-5分钟的碎片化学习,可能是坐地铁.等公交,积少成多,水滴石穿,码字辛苦,如果你吃了蛋觉得味道不错,希望点个赞,谢 ...

  8. ASP.NET CORE系列【一】搭建ASP.NET CORE项目

    原文:ASP.NET CORE系列[一]搭建ASP.NET CORE项目 为什么要使用 ASP.NET Core? NET Core 刚发布的时候根据介绍就有点心里痒痒,微软的尿性都懂的,新东西bug ...

  9. .ne中的控制器循环出来的数据如何显示在视图上_【asp.net core 系列】3 视图以及视图与控制器...

    0.前言 在之前的几篇中,我们大概介绍了如何创建一个http://asp.net core mvc项目以及http请求如何被路由转交给对应的执行单元.这一篇我们将介绍一下控制器与视图直接的关系. 1. ...

最新文章

  1. layui一个表格中怎么接两个接口的值_layer学习笔记之table表格引入数据实现分页...
  2. python从零实习深度学习_月薪45K的深度程序员教你从零在Python中开发深度学习
  3. Servlet / Tomcat / Spring 之间的关系
  4. NameServer的总控逻辑
  5. batocera游戏整合包_FIFAol3头像包整合
  6. ztree在刷新时第一个父节点消失_从反向传播推导到梯度消失and爆炸的原因及解决方案(从DNN到RNN,内附详细反向传播公式推导)...
  7. android.mk 冒号,android学习-ndk-build(androidstudio编译cocos2d-x库的cpp为so文件的解释)
  8. springboot 使用mybatis-plus 配置乐观锁
  9. 2021 年押宝哪个后端语言呢?
  10. 无法写入最后一个_手机资讯:iPhone 扩容机能否进行刷机刷机后无法激活怎么办...
  11. vmpalyer虚拟机的使用教程,小白也能看懂
  12. Linux下安装海康威视工业相机客户端
  13. 【通信电子电路】谐振功率放大电路multisim仿真
  14. Theano入门神经网络(三)
  15. 多目标人工秃鹫优化算法(MATLAB源码分享,智能优化算法) 提出了一种多目标版本的人工秃鹫优化算法(AVOA)
  16. mysql高级教程(一)
  17. python pandas 增加一列_Python之pandas新增列
  18. linux服务器重启日志,Linux系统最近重启时间、错误日志
  19. 服务器监控cacti
  20. Nodejs教程笔记(五)fs续 读取 写入 管道流

热门文章

  1. shell脚本----for循环-转 Syntax error: Bad for loop variable
  2. ubuntu ftp server-转
  3. Perl用LWP实现GET/POST数据发送 原
  4. Perl 模块 Getopt::Std 和 Getopt::Long
  5. Oracle中Sequence序列的使用
  6. JBoss 目录结构解释
  7. 使用shell测试cdn状态
  8. 轻松实现SQL异地备份
  9. C++ 作用域与生命周期
  10. nvarchar,nchar,vchar,nvchar,char…