ASP.NET Core通用主机实现托管服务

前文介绍了.Net core的通用主机的配置,在基础配置完成后,下一步就是注册我们的后台任务了。.net core提供了一个通用的后台服务接口IHostedService,称为托管服务。一个注册托管服务的示例如下:

hostBuilder.ConfigureServices((hostContext, services) =>
{
    services.AddHostedService<LifetimeEventsHostedService>();
    services.AddHostedService<TimedHostedService>();
});

而一个托管服务的简单实现如下:

class MyHostedService :IHostedService
{
    public Task StartAsync(CancellationToken cancellationToken)
    {
        return Task.CompletedTask;
    }
    public Task StopAsync(CancellationToken cancellationToken)
    {
        return Task.CompletedTask;
    }
}

每个 IHostedService 实现都按照 ConfigureServices 中服务注册的顺序执行。 主机启动时,每个 IHostedService 上都会调用 StartAsync。主机正常关闭时,以反向注册顺序调用 StopAsync。相比传统的后台任务,这里就提供了一个好处:在服务终止的时候可以优雅的关闭(graceful close)。

另外,由于使用了DI框架,可以在托管服务的构造函数中很方便的获取其它服务:

public MyHostedService(IHostEnvironment env, IHostApplicationLifetime appLifetime)
{
}

IHostingEnvironment

IHostingEnvironment主要用来提供App的环境信息,具体就不多介绍了。

IApplicationLifetime

IApplicationLifetime是托管服务经常引入的一个服务,它允许获取应用的启动和关闭事件,并且能关闭整个主机,具体接口如下:

事件订阅:

  • ApplicationStarted:主机已完全启动。
  • ApplicationStopped:主机正在完成正常关闭。 应处理所有请求。 关闭受到阻止,直到完成此事件。
  • ApplicationStopping:主机正在执行正常关闭。 仍在处理请求。 关闭受到阻止,直到完成此事件。

操作:

  • StopApplication:关闭整个主机

BackgroundService

很多时候,我们后台服务往往只是一个简单的任务,并不需要关闭,此时可以使用一个更简单的模型:BackgroundService

class MyHostedService : BackgroundService
{
    protected override Task ExecuteAsync(CancellationToken stoppingToken)
    {
        //do something
        return Task.CompletedTask;
    }
}

它本身是IHostedService的一个实现,但进一步简化了程序功能,只提供一个ExecuteAsync接口,我们只需要在该函数中实现后台任务即可。

到此这篇关于ASP.NET Core通用主机实现托管服务的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Asp.Net Core利用xUnit进行主机级别的网络集成测试详解

    前言 在开发 Asp.Net Core 应用程序的过程中,我们常常需要对业务代码编写单元测试,这种方法既快速又有效,利用单元测试做代码覆盖测试,也是非常必要的事情:但是,但我们需要对系统进行集成测试的时候,需要启动服务主机,利用浏览器或者Postman 等网络工具对接口进行集成测试,这就非常的不方便,同时浪费了大量的时间在重复启动应用程序上:今天要介绍就是如何在不启动应用程序的情况下,对 Asp.Net Core WebApi 项目进行网络集成测试. 一.建立项目 1.1 首先我们建立两个项目,

  • ASP.NET Core中的通用主机HostBuilder

    目录 1.前言 2.介绍 3.设置主机 4.选项 4.1关闭超时值 5.默认服务 6.主机配置 6.1ConfigureHostConfiguration 6.2ConfigureAppConfiguration 6.3ConfigureServices 6.4ConfigureLogging 6.4.1UseConsoleLifetime 7.容器配置 8.扩展性 9.管理主机 9.1Run 9.2RunAsync 9.3RunConsoleAsync 9.4Start和StopAsync 9

  • ASP.NET Core配置和管理Web主机

    目录 1.前言 2.设置主机 2.1执行下列任务 2.2重写和增强定义的配置 3.主机配置值 3.1应用程序键(名称) 3.2捕获启动错误 3.3内容根 3.4详细错误 3.5环境 3.6HTTPS端口 3.7服务器(Kestrel) URL 4.重写配置 5.管理主机 6.IHostingEnvironment接口 7.IApplicationLifetime接口 8.作用域验证 1.前言 ASP.NET Core应用程序可以配置和启动主机(Host).主机负责应用程序启动和生命周期管理,配置

  • .NET Core使用CZGL.SystemInfo库获取主机运行资源

    简介 CZGL.SystemInfo 是一个支持 Windows 和 Linux 的资源信息获取库,用于获取系统环境.机器资源信息.系统资源使用情况. Nuget 搜索 CZGL.SystemInfo 即可安装. 类库中每一个属性和方法,我都加上了注释,调用时可以看得到. 平台通用 CZGL.SystemInfo 命名空间下,有个 EnvironmentInfo 静态类,用于获取各种信息. CZGL.SystemInfo.Info 命名空间中,有三个类型,用于获取和记录不同类型的信息. Mach

  • ASP.NET Core通用主机的系统配置

    ASP.NET Core 2.0 中的 WebHost(实现 IWebHost 的基类)是用于为进程提供 HTTP 服务器功能的基础结构项目,例如,如果正在实现 MVC Web 应用或 Web API 服务. 它提供 ASP.NET Core 中所有新的基础结构优点,使用户能够使用依赖关系注入,在请求管道中插入中间件等,并精确地将这些 IHostedServices 用于后台任务. .NET Core 2.1 中引入了 Host(实现 IHost 的基类). 它能让用户拥有与 WebHost相似

  • 快速了解如何在.NETCORE中使用Generic-Host建立主机

    .NETCORE 中的 Generic Host 本文以自己在工作中学习和使用.net core generic-host 作一个总结. 前言 在创建的ASPNETCORE项目中,我们可以在Main()中看见,我们通过IWebHostBuild创建了一个IWebHost,而微软提供了WebHost.CreateDefaultBuilder(args)来帮助我们更轻松得创建WebHost. 常常我们的需求不需要创建Web项目,比如后台任务,那么我们如何像使用AspNetCore一样创建控制台项目.

  • ASP.NET Core通用主机实现托管服务

    前文介绍了.Net core的通用主机的配置,在基础配置完成后,下一步就是注册我们的后台任务了..net core提供了一个通用的后台服务接口IHostedService,称为托管服务.一个注册托管服务的示例如下: hostBuilder.ConfigureServices((hostContext, services) => { services.AddHostedService<LifetimeEventsHostedService>(); services.AddHostedSer

  • ASP.NET Core扩展库之Http通用扩展库的使用详解

    本文将介绍Xfrogcn.AspNetCore.Extensions扩展库对于Http相关的其他功能扩展,这些功能旨在处理一些常见需求, 包括请求缓冲.请求头传递.请求头日志范围.针对HttpClient与HttpRequestMessage.HttpResponseMessage的扩展方法. 一.开启服务端请求缓冲 ASP.NET Core 中请求体是不能多次读取的,由于在MVC中,框架已经读取过请求体,如果你在控制器中再次读取,将会引发异常,如下示例: [ApiController] [Ro

  • 如何处理ASP.NET Core中HTML5客户端路由回退的问题

    前言 大家应该都有所体会,我们在使用由Angular,React,Vue等应用程序框架构建的客户端应用程序时,您总是会处理HTML5客户端路由,它将完全在浏览器中处理到页面和组件的客户端路由.几乎完全在浏览器中... HTML5客户端路由在客户端上工作的很好,但是当深入链接到一个站点或在浏览器中按刷新时,客户端路由有一个恶习,变成服务器HTTP请求.请求可能未配置服务器的路由. 在这篇文章中,我将讨论如何使ASP.NET Core(或间接ASP.NET应用程序)通过有效地将客户端应用程序重新连接

  • 详解ASP.NET Core中配置监听URLs的五种方式

    默认情况下,ASP. NET Core应用会监听一下2个Url: http://localhost:5000 https://localhost:5001 在本篇博文中,我将展示如何使用五种不同的方式改变应用监听的URLs. 在ASP.NET Core项目启动时,有多种配置监听Url的方式,在我之前的一篇博客中,已经展示了在ASP.NET Core 1.0中如何应用不同的方式配置,在ASP.NET Core 3.x中,大部分方式还是一样的. UseUrls() - 在Program.cs配置程序

  • ASP.NET Core扩展库之日志功能的使用详解

    上一篇我们对Xfrogcn.AspNetCore.Extensions扩展库功能进行了简单的介绍,从这一篇文章开始,我将逐步介绍扩展库中的核心功能.     日志作为非业务的通用领域基础功能,有非常多的技术实现,这些第三方库避免了我们花费时间去重复实现,不过,很多日志库配置复杂,不易于使用,入手较难,而有些库可能与ASP.NET Core的结合并不好.     如果我们没有对所使用的日志库进行详细了解,日志库也可能产生严重的问题,在我的开发生涯中,曾经遇到过多次因为日志库而导致的生产事故.  

  • 深入探究ASP.NET Core Startup初始化问题

    前言 Startup类相信大家都比较熟悉,在我们使用ASP.NET Core开发过程中经常用到的类,我们通常使用它进行IOC服务注册,配置中间件信息等.虽然它不是必须的,但是将这些操作统一在Startup中做处理,会在实际开发中带来许多方便.当我们谈起Startup类的时候你有没有好奇过以下几点 为何我们自定义的Startup可以正常工作. 我们定义的Startup类中ConfigureServices和Configure只能叫这个名字才能被调用到吗? 在使用泛型主机(IHostBuilder)

随机推荐