续之前讲的在TopShelf上部署ASP.NET Core程序,作为后台服务运行,自从.NET Core 3.0出现以后,出现了自带的Generic Host,使得自托管服务变为可能。这种方式和TopShelf方式一样,可以直接F5进行服务的调试,也为跨平台后台服务编写提供了一种新的方案。

创建服务

以VS2019为例,确保安装了.NET CORE 3.0以上的SDK,新建项目,在项目模板里面可以找到Worker Service模板,创建后,vs已经帮我们创建了Program.cs和Worker.cs两个文件。

在Program.cs中,

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;namespace WorkerServiceTest
{public class Program{public static void Main(string[] args){CreateHostBuilder(args).Build().Run();}public static IHostBuilder CreateHostBuilder(string[] args) =>Host.CreateDefaultBuilder(args).ConfigureServices((hostContext, services) =>{services.AddHostedService<Worker>();});}}
}

可以发现,配置的方式和ASP.NET CORE的方式基本一样一样的,使用了内置的DI容器。那我们同样可以使用AddSingleton等方法进行其他逻辑的注入,也可以添加多个服务任务。

而Worker类已经写了好一个范例,其中有一个ExecuteAsync方法,可以直接执行后台任务。这个时候,直接F5就可以正常运行了,自带了一个显示当前时间的小程序。

跨平台支持

虽然程序可以正常执行,但是还不能正常部署为服务,需要依据平台添加对应的nuget包:

  • windows服务,需要添加:

CopyInstall-Package Microsoft.Extensions.Hosting.WindowsServices
  • Linux服务,需要添加:

CopyInstall-Package Microsoft.Extensions.Hosting.Systemd

如果想实现一套程序多处运行,那么直接同时安装两个package就可以了。接下来在CreateHostBuilder中,添加UseWindowsService()和UseSystemd()。

public static IHostBuilder CreateHostBuilder(string[] args)
{if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)){return Host.CreateDefaultBuilder(args).ConfigureServices((hostContext, services) =>{services.AddHostedService<Worker>();}).UseWindowsService();}else{return Host.CreateDefaultBuilder(args).ConfigureServices((hostContext, services) =>{services.AddHostedService<Worker>();}).UseSystemd();}
}

这里使用到了.NET Core判断平台的一个函数:IsOSPlatform,可以判断是否在Windows平台运行,并进行分别调用。

部署

编译完成之后,找到生成的exe文件路径。

Windows下部署

管理员下运行cmd/powershell,执行

psc.exe create WorkerServiceTest binPath=C:\Users\source\repos\WorkerServiceTest\WorkerServiceTest\bin\Debug\netcoreapp3.1\WorkerServiceTest.exe

提示CreateService 成功即安装成功了,可以输入下面的命令运行服务。

sc.exe start WorkerServiceTest

sc.exe负责管理服务,具体配置启动方式和删除,可以查看命令的帮助。另外,友情提醒,如果是在powershell中,不要省略这个.exe,sc有别的用处...

Linux下部署

将整个程序文件夹传输到Linux文件夹下,我这边使用的是CentOS 8。新建一个运行服务的用户:

useradd -m dotnetuser -p dotnetpass

转到/etc/systemd/system文件夹,建立一个WorkerServiceTest.service的文件,这个WorkerServiceTest是你的服务名称。

输入以下内容并保存(systemd配置文件):

[Unit]
Description=WorkerServiceTest[Service]
ExecStart=dotnet /bin/dotnet/WorkerServiceTest.dll
WorkingDirectory=/bin/dotnet/
User=dotnetuser
Group=dotnetuser
Restart=on-failure
SyslogIdentifier=WorkerServiceTest
PrivateTmp=true[Install]
WantedBy=multi-user.target

注意,你需要已经安装有dotnet runtime 3.0以上版本才可以。
可以使用以下命令进行安装

yum install dotnet-runtime-3.1

接下来是配置服务和启动服务

#重载配置
systemctl daemon-reload
#设置服务自动启动
systemctl enable WorkerServiceTest.service
#运行服务
systemctl start WorkerServiceTest.service
#查询服务状态
systemctl status WorkerServiceTest.service

然后可以发现,程序可以正常运行。

补充

作为服务,应该要提供一些状态用于外部监测,在Worker.cs中,Worker类可以重写StartAsyncStopAsync方法,提供服务启动和停止的信息,但是windows提供的服务失败后动作等功能都找不到配置的地方,可能这就是局限吧。

总结

一次编写,处处运行,对于后台服务也是如此,很简洁。但是暂时手上没有mac电脑,也不知道mac上面有没有对应的解决方案。可能TopShelf的mono模式可以支持吧。

比较TopShelf模式

总体讲,相较于TopShelf的方式,Service Worker方式有利有弊。

优点:

  1. 在相同的框架(.NET CORE 3.0+)下支持跨平台,支持linux服务的systemctl管理,topshelf在linux下需要mono。

  2. 配置方式和ASP.NET CORE相似度极高,基本上可以无缝切换。

缺点:

  1. 不支持TopSelf的自带命令install/start/uninstall等命令,依然需要sc进行部署,比较麻烦。

  2. 不支持windows的很多服务管理特性(比如Pause,依赖管理)。

  3. 只支持.NET CORE 3.0以后的框架,不支持.NET FRAMEWORK和早期版本的.NET CORE。

参考资料

  • https://devblogs.microsoft.com/aspnet/net-core-workers-as-windows-services/

  • https://devblogs.microsoft.com/dotnet/net-core-and-systemd/

  • https://docs.microsoft.com/en-us/dotnet/core/extensions/generic-host

  • https://dejanstojanovic.net/aspnet/2018/june/setting-up-net-core-servicedaemon-on-linux-os/

  • https://dotnetcoretutorials.com/2019/12/07/creating-windows-services-in-net-core-part-3-the-net-core-worker-way/

出处:https://www.cnblogs.com/podolski/p/13890572.html

打造跨平台.NET Core后台服务相关推荐

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

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

  2. 【新书推荐】《ASP.NET Core微服务实战:在云环境中开发、测试和部署跨平台服务》 带你走近微服务开发...

    <ASP.NET Core 微服务实战>译者序:https://blog.jijiechen.com/post/aspnetcore-microservices-preface-by-tr ...

  3. .Net Core微服务架构技术栈的那些事

    一.前言 大家一直都在谈论微服务架构,园子里面也有很多关于微服务的文章,前几天也有一些园子的朋友问我微服务架构的一些技术,我这里就整理了微服务架构的技术栈路线图,这里就分享出来和大家一起探讨学习,同时 ...

  4. asp.net core后台系统登录的快速构建

    登录流程图 示例预览 构建步骤 当然,你也可以直接之前前往coding仓库查看源码,要是发现bug记得提醒我啊~ LoginDemo地址 1. 首先你得有一个项目 2. 然后你需要一个登录页面 完整L ...

  5. .NET Core微服务之基于Consul实现服务治理

    一.Consul基础介绍 Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置.与其他分布式服务注册与发现的方案,比如 Airbnb的SmartStack等相比,Co ...

  6. 【NET CORE微服务一条龙应用】第三章 认证授权与动态权限配置

    [NET CORE微服务一条龙应用]第三章 认证授权与动态权限配置 介绍 系列目录:[NET CORE微服务一条龙应用]开始篇与目录 在微服务的应用中,统一的认证授权是必不可少的组件,本文将介绍微服务 ...

  7. NET Core微服务之路:自己动手实现Rpc服务框架,基于DotEasy.Rpc服务框架的介绍和集成...

    原文:NET Core微服务之路:自己动手实现Rpc服务框架,基于DotEasy.Rpc服务框架的介绍和集成 本篇内容属于非实用性(拿来即用)介绍,如对框架设计没兴趣的朋友,请略过. 快一个月没有写博 ...

  8. .NET Core微服务之路:基于Consul最少集群实现服务的注册与发现(一)

    原文:.NET Core微服务之路:基于Consul最少集群实现服务的注册与发现(一) Consul介绍 Consul是HashiCorp公司推出的开源工具[开源地址:https://github.c ...

  9. ASP.NET Core微服务(七)——【docker部署linux上线】(RDS+API接口测试部分)

    ASP.NET Core微服务(七)--[docker部署linux上线]: 本文测试采用阿里云的RDS(sqlserver服务器)+ECS(linux服務器)进行测试,由于是测试,[按量付费]买个最 ...

最新文章

  1. flask_socketio 用法:
  2. busybox编译笔记
  3. Spring-国际化信息02-MessageSource接口
  4. MySQL 出现 The table is full 的解决方法
  5. php错误403_phpstudy访问文件报错403/Forbidden解决办法
  6. Unexpected exception 'Cannot run program '的解决
  7. C#/java 求最大公约数和最小公倍数
  8. 计算机高级技师论文网,高级技师论文(数控铣床、加工中心).doc
  9. GitGithub 视频教程(Java版)
  10. OpenCV的二值化处理函数threshold()详解
  11. 软件库网站源码+多套模板 附手机版 附教程
  12. 替换PanDown神器 更新Pdown 3.4.6 清爽版
  13. 5D论文PMF及改进
  14. Gartner:2017年中国新兴技术成熟度曲线
  15. 嵌入式系统C语言编程基础
  16. 对比两张表的数据并筛选出数据不同的
  17. 自学英语的几个网站(免费网站)
  18. 苏宁0元撸货福利来了!只限新人!老用户放弃吧!便宜只能占一次
  19. 克里斯坦森创新框架与皮萨诺创新画布
  20. FFmpeg入门详解--音视频原理及应用:梅会东:清华大学出版社

热门文章

  1. Zynq7000开发系列-5(OpenCV开发环境搭建:Ubuntu、Zynq)
  2. 论DATASNAP远程方法支持自定义对象作参数
  3. Public DNS (公共域名解析服务)
  4. 跨域访问-JSONP
  5. 代码Review发现问题
  6. js javaScript array 取指定元素索引、判断是否相同、重复、过滤数据
  7. do...while(0)的妙用
  8. Confluence Cloud的Teams Message Extension
  9. 查看模拟器使用端口_为什么我们仍然使用模拟音频端口?
  10. Jmeter HTTP请求后响应数据显示乱码解决方法