一.概述

  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地址:

    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()); 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的更多相关文章

  1. asp.net core 3.x 通用主机原理及使用

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

  2. asp.net core 3.x 通用主机是如何承载asp.net core的-上

    一.前言 上一篇<asp.net core 3.x 通用主机原理及使用>扯了下3.x中的通用主机,刚好有哥们写了篇<.NET Core 3.1和WorkerServices构建Win ...

  3. asp.net core 系列 16 Web主机 IWebHostBuilder

    一.概述 在asp.net core中,Host主机负责应用程序启动和生存期管理.host主机包括Web 主机(IWebHostBuilder)和通用主机(IHostBuilder).Web 主机是适 ...

  4. 翻译 - ASP.NET Core 基本知识 - 通用主机 (Generic Host)

    翻译自 https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/generic-host?view=aspnetcore-5.0 ...

  5. 【目录】asp.net core系列篇

    随笔分类 - asp.net core系列篇 asp.net core系列 68 Filter管道过滤器 摘要: 一.概述 本篇详细了解一下asp.net core filters,filter叫&q ...

  6. asp.net core系列 39 Web 应用Razor 介绍与详细示例

    一. Razor介绍 在使用ASP.NET Core Web开发时, ASP.NET Core MVC 提供了一个新特性Razor. 这样开发Web包括了MVC框架和Razor框架.对于Razor来说 ...

  7. asp.net core系列 39 Razor 介绍与详细示例

    原文:asp.net core系列 39 Razor 介绍与详细示例 一. Razor介绍 在使用ASP.NET Core Web开发时, ASP.NET Core MVC 提供了一个新特性Razor ...

  8. 技术的正宗与野路子 c#, AOP动态代理实现动态权限控制(一) 探索基于.NET下实现一句话木马之asmx篇 asp.net core 系列 9 环境(Development、Staging 、Production)

    黄衫女子的武功似乎与周芷若乃是一路,飘忽灵动,变幻无方,但举手抬足之间却是正而不邪,如说周芷若形似鬼魅,那黄衫女子便是态拟神仙. 这段描写出自<倚天屠龙记>第三十八回. “九阴神抓”本是& ...

  9. WPF中的常用布局 栈的实现 一个关于素数的神奇性质 C# defualt关键字默认值用法 接口通俗理解 C# Json序列化和反序列化 ASP.NET CORE系列【五】webapi整理以及RESTful风格化

    WPF中的常用布局   一 写在开头1.1 写在开头微软是一家伟大的公司.评价一门技术的好坏得看具体的需求,没有哪门技术是面面俱到地好,应该抛弃对微软和微软的技术的偏见. 1.2 本文内容本文主要内容 ...

随机推荐

  1. TextBox使用技巧--转载

    [转载出处注明:http://tieba.baidu.com/p/3677706825] 在使用Visual Basic开发应用程序时,TextBox控件是最常用的(特别对于数据库程序),以下是笔者在 ...

  2. 使用 Swoole 来加速 Laravel应用

    Swoole 是为 PHP 开发的生产级异步编程框架. 他是一个纯 C 开发的扩展, 他允许 PHP 开发者在 PHP 中写 高性能,可扩展的并发 TCP, UDP, Unix socket, HTT ...

  3. vue与avuex

    现在 使用avuex做出来表格效果,但是看到源码看到需要使用vue,不得不开始学习vue 配置环境:cnpm配置过程:a:首先下载node.js然后根据https://www.cnblogs.com/ ...

  4. url.cn短网址批量缩短开发接口

    https://www.showapi.com/api/view/1728 //md5签名方式--非简单签名 <?php header("Content-Type:text/html; ...

  5. 平时作业七 Java

    以下是几本计算机书籍的基本信息编号 书名 价格 出版社1 JAVA基础 32 清华大学出版社2 JAVA WEB开发 40 电子工业出版社3 面向对象程序设计 28 清华大学出版社4 Struts开发 ...

  6. 记一次非常规方法对接硬件设备(Grason Stadler GSI 61)

    Grason Stadler GSI 61 电测听设备 (写下设备的名字, 希望别人遇坑可以搜到) 对接说明 设备厂家提供自带的软件,但是没有找到接口说明.我们需要获取设备发送过来的数据. 厂家提供的 ...

  7. 关于阿里ICON矢量图(SVG)上传问题.

    注意点: 1. 存储为svg格式(建议使用存储为svg,不要使用导出为svg)2. 图像位置:链接(注意哦,不要点嵌入和保留编辑功能)---确定3. AI里面选中图形,点对象-路径-轮廓化描边 软件编 ...

  8. [Ubuntu]Firefox书签Ubuntu与Windows同步

    Ubuntu默认使用Firefox国际版.其他平台访问官网下载到的都是中国版,而国际版和中国版使用两套账号体系,相互之间无法同步,导致Ubuntu的Firefox无法和其他平台的Firefox同步书签 ...

  9. opencv imwrite保存图片花屏的问题

    问题:在项目中用opencv的imwrite保存图片出现花屏的问题,如下图: 思路:1.  因为项目中的图像数据(float类型,0-255)是在GPU中,保存的话:可以用CPU保存图片,也可以用GP ...

  10. 二叉查找树的C++实现

    #include <iostream> #include <algorithm> #include <stack> using namespace std; /// ...