2019第一篇文章。

此文源于前公司在迁移项目到.NET Core的过程中,希望使用Generic Host来管理定时任务程序时,没法部署到Windows服务的问题,而且官方也没给出解决方案,只能关注一下官方issue #809 等他们方解决了。

官方文档只提供了一个《在 Windows 服务中托管 ASP.NET Core》的方案,可以使用Microsoft.AspNetCore.Hosting.WindowsServices类库来把Web应用部署为Windows服务。但是ASP.NET Core虽然是控制台程序,但是它本身是使用了含有HTTP管道的Web Host来负责应用程序的生命周期管理,用它来作为定时任务的话,会有很多不必要的工作负载,例如占用端口、增加了很多依赖等等。

官方意识到这个问题之后,在.NET Core 2.1版本新增了Generic Host通用主机,剥离了原来WebHost的Http管道相关的API,源码中可以发现Web Host已经基于Generic Host实现。它才是作为纯粹定时任务程序的最佳拍档。

但是由于Generic Host本身非常简单,用它运行的程序设置在注册为Windows服务启动之后会自动停止。研究很久之后才知道,想在Windows上启动服务,还是不能像Linux上那么简单——

于是尝试结合Topshelf来创建Windows服务,最终成功了。

1|1实现方法

  1. 先实现IHostLifetime接口来接管应用程序的生命周期,其实就是用空的实现来替换掉默认的ConsoleLifetime,这样就可以在之后由Topshelf框架内部去管理生命周期。

  2. 然后实现IHostedService接口,把后台任务逻辑写到StartAsync方法中,参见官方文档《在 ASP.NET Core 中使用托管服务实现后台任务》,本文示例使用定时写入文本到一个文件来测试定时任务是否成功运行。

  3. 构建Generic Host,在ConfigureServices方法中注册TopshelfLifetime,并且注册一个托管服务FileWriterService,就能完成Generic Host的简单构建,当然完整的项目应该还包含配置、日志等等。最后,使用Topshelf来接管Generic Host,创建Windows服务。

  4. 最后发布应用程序,并安装到Windows服务。

以管理员权限开启终端,执行命令:

这样这个Windows服务就启动了!查看输出文件,可以看到定时写入成功,服务也一直没关闭~

1|2示例代码https://github.com/ElderJames/GenericHostWindowsServiceWithTopshelf

1|3参考链接

官方文档《.NET 通用主机》

官方文档《在 ASP.NET Core 中使用托管服务实现后台任务》

原文地址:https://www.cnblogs.com/ElderJames/p/Using-Topshelf-To-Deploy-Net-Core-Generic-Host-App-To-Windows-Services.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

利用Topshelf把.NET Core Generic Host管理的应用程序部署为Windows服务相关推荐

  1. .NET Core Generic Host项目使用Topshelf部署为Windows服务

    1..NET Core Generic Host是什么? 在.NET Core 2.1版本加入了一种新的Host,即Generic Host(通用主机). 现在在2.1版本的Asp.Net Core中 ...

  2. ASP.NET Core Web程序托管到Windows 服务

    前言 在 .NET Core 3.1和WorkerServices构建Windows服务 我们也看到了,如何将workerservices构建成服务,那么本篇文章我们再来看看如何将web应用程序托管到 ...

  3. 在CentOS7上部署.net core 控制台应用程序部署为后台服务

    在CentOS7上部署.net core 控制台app为后台服务 转载于:https://www.cnblogs.com/wangwust/p/9821547.html

  4. .NET Core 3.0】框架之十三 || 部署攻略

    本文有配套视频: https://www.bilibili.com/video/av58096866/?p=9 一.部署 1.WIN_独立部署 感谢群里(白云)小伙伴,博主 @小淋科技  提出的方案( ...

  5. 第三节:Windows平台部署Asp.Net Core应用(基于IIS和Windows服务两种模式)

    一. 简介 Asp.Net Core 部署方式有两种:依赖框架和独立部署. 1. 框架依赖的部署: 顾名思义,依赖框架的部署 (FDD) 依赖目标系统上存在共享系统级版本的 .NET Core. 由于 ...

  6. windows 服务中托管asp.net core

    在windows 服务中托管asp.net core SDK 2.1.300 官方示例 1.添加运行标识符 xml <PropertyGroup> <TargetFramework& ...

  7. .NET Core 中的 Generic Host快速使用指南

    本文以自己在工作中学习和使用.net core generic-host 作一个总结. 前言 在创建的ASPNETCORE项目中,我们可以在Main()中看见,我们通过IWebHostBuild创建了 ...

  8. 谈谈.NET Core中基于Generic Host来实现后台任务

    前言 很多时候,后台任务对我们来说是一个利器,帮我们在后面处理了成千上万的事情. 在.NET Framework时代,我们可能比较多的就是一个项目,会有一到多个对应的Windows服务,这些Windo ...

  9. Asp.net Core 2.1新功能Generic Host(通用主机)深度学习

    什么是Generic Host ? 这是在Asp.Net Core 2.1加入了一种新的Host,现在2.1版本的Asp.Net Core中,有了两种可用的Host. Web Host –适用于托管W ...

最新文章

  1. flutter离线源码安装包最新版本下载地址
  2. 第四届社交机器人论坛第一期开幕:李航、刘群、姜大昕主讲
  3. YOLOv3中darknet的各种层的说明
  4. 三、Numpy数组操作
  5. 学习笔记 - 002
  6. CENTOS7 修改 网卡名称为eth0的配置方法
  7. UVA1276 Network
  8. BZOJ4003[JLOI2015]城池攻占——可并堆
  9. 9.深入分布式缓存:从原理到实践 --- Tair探秘
  10. python 操作 saltstack Api(二) 示例
  11. 乐鑫再次称王WiFi MCU市场
  12. 常见笔顺错误的字_容易出错的汉字|汉字中哪些字笔顺容易错
  13. 3、那智机器人手柄各操作键的功能
  14. 0x0F转换成二进制
  15. 使用Layered分层窗口实现视频会议中的桌面区域共享
  16. 自称骇客的基本都是骗子
  17. 量化——【01】你不得不知道的金融量化基础知识
  18. 基于yolov5s+bifpn实践隧道裂缝裂痕检测
  19. 最好用的mac免费PDF阅读器是什么?
  20. 【目标跟踪】Long-term Correlation Tracking 阅读笔记

热门文章

  1. 亚信科技数据库AntDB通过金融分布式事务数据库标准测试
  2. 虚拟DOM Diff算法解析
  3. EntityFramework 动态构造排序 FuncIQueryableT, IOrderedQueryableT Dynamic
  4. 2015年网页设计最佳颜色搭配的9种选择
  5. 基于centos5.8源码安装nginx之LNMP
  6. WPF 实现倒计时转场动画~
  7. Hello Blazor:(15)使用bUnit进行单元测试
  8. Win11安卓极速教程!
  9. 还在纠结Dapper或者EF Core?不妨试试“混合ORM”--RepoDb
  10. GitHub 的 Action 接入 Stryker.NET 进行自动化测试单元测试鲁棒性