.NetCore8 windows 系统后台服务 workserver
workserver是一种专门用来运行耗时服务所提供的一种项目模板,后台服务
一、创建
VS Install必须支持ASP.Net和Web开发

完成后,安装nuget包 (一个是windows的系统服务,一个是linux的系统服务)
Install-Package Microsoft.Extensions.Hosting.WindowsServices
Install-Package Microsoft.Extensions.Hosting.Systemd
二、代码如下
Program.cs
using Microsoft.AspNetCore.Builder; using NLog.Web; using SimpleMQTT; using WLAdmin.Background; var builder = WebApplication.CreateBuilder(args); builder.Host.UseWindowsService();// 使用Windows服务托管 builder.Host.UseSystemd();//来配置服务以在 Linux 上作为 systemd 服务运行 builder.Host.UseNLog(); // 使用NLog为Microsoft.Extensions.Logging的日志记录,默认根目录下NLog.config builder.Services.AddSingleton<IMqttClientManager, MqttClientManager>();// 添加MQTT客户端管理器 builder.Services.AddHostedService<Worker>();// 添加后台服务 var app = builder.Build(); app.Run();
Worker.cs
public class Worker : BackgroundService { private readonly ILogger<Worker> _logger; private readonly MqttClient _mqtt; public Worker(ILogger<Worker> logger, IMqttClientManager mqttClientManager) { _logger = logger; this._mqtt = mqttClientManager.GetClient(); } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { //订阅库位主题 await _mqtt.SubscribeAsync("FMS/WmStoragePosition/#", (e) => { var msg = e.Payload.ToStr(); var topicList = e.Topic.Split("/");//根据/分割 var clientId = topicList[topicList.Length - 1];//获取客户端ID _logger.LogInformation($"库位{clientId},状态{msg}"); }); //订阅储位主题 await _mqtt.SubscribeAsync("FMS/FmsWhPosition/#", (e) => { var msg = e.Payload.ToStr(); var topicList = e.Topic.Split("/");//根据/分割 var clientId = topicList[topicList.Length - 1];//获取客户端ID _logger.LogInformation($"储位{clientId},状态{msg}"); }); } }
三、增加4个bat脚本,属性:如果较新则复制
1、安装服务.bat
@echo off color 0e @echo ================================== @echo 提醒:请右键本文件,用管理员方式打开。 @echo ================================== @echo Start Install WLAdmin.Background cd .. sc create WLAdmin.Background binPath=%~dp0WLAdmin.Background.exe start= auto sc description WLAdmin.Background "WLAdmin后台服务" Net Start WLAdmin.Background pause
2、启动服务
@echo off color 0e @echo ================================== @echo 提醒:请右键本文件,用管理员方式打开。 @echo ================================== @echo Start Start WLAdmin.Background Net Start WLAdmin.Background pause
3、停止服务
@echo off color 0e @echo ================================== @echo 提醒:请右键本文件,用管理员方式打开。 @echo ================================== @echo Start Stop WLAdmin.Background Net stop WLAdmin.Background pause
4、卸载服务
@echo off color 0e @echo ================================== @echo 提醒:请右键本文件,用管理员方式打开。 @echo ================================== @echo Start Remove WLAdmin.Background Net stop WLAdmin.Background sc delete WLAdmin.Background pause
运行安装、启动服务就会添加到windows服务里面
四、日志保存到文件夹
1、NLog支持
安装依赖 NLog.Web.AspNetCore

Nlog.config配置文件
<?xml version="1.0" encoding="utf-8" ?> <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd" autoReload="true" throwExceptions="false" internalLogLevel="Warn" internalLogFile="Logs/nlog-internal.log"> <variable name="myvar" value="myvalue"/> <targets> <!-- write logs to file --> <target xsi:type="File" name="allfile" fileName="Logs/${date:format=yyyyMM}/nlog-all-${shortdate}.log" layout="${longdate}|${event-properties:item=EventId.Id}|${uppercase:${level}}|${logger} ${newline}${message} ${exception} ${newline}" /> <target xsi:type="File" name="ownFile-web" fileName="Logs/${date:format=yyyyMM}/nlog-own-${shortdate}.log" layout="${longdate}|${event-properties:item=EventId.Id}|${uppercase:${level}}|${logger} ${newline}${message} ${exception} ${newline}" /> <!-- |url: ${aspnet-request-url}|action: ${aspnet-mvc-action}" --> <target xsi:type="Null" name="blackhole" /> </targets> <rules> <!--All logs, including from Microsoft--> <!--minlevel 改为Trace 跟踪全部 Error 只捕获异常--> <logger name="*" minlevel="Error" writeTo="allfile" /> <!--Skip Microsoft logs and so log only own logs--> <logger name="Microsoft.*" minlevel="Trace" writeTo="blackhole" final="true" /> <logger name="*" minlevel="Trace" writeTo="ownFile-web" /> </rules> </nlog>
启用Nlog
builder.Host.UseNLog(); // 使用NLog为Microsoft.Extensions.Logging的日志记录,默认根目录下NLog.config
使用
_logger.LogInformation($"储位{clientId},状态{msg}");
2、自己记录
//手动添加日志 private void Log(string data) { //Environment.CurrentDirectory = AppDomain.CurrentDomain.BaseDirectory; using (StreamWriter sw = new StreamWriter($"{AppDomain.CurrentDomain.BaseDirectory}/Logs/{DateTime.Now.ToString("yyyy-MM-dd")}.txt", true)) { sw.WriteLine(data); } }
使用
Log($"Worker running at: {DateTime.Now}:储位{clientId},状态{msg}");
浙公网安备 33010602011771号