.net7 创建windows后台服务
开发语言:C#
运行时:.net7
开发环境:visual studio 2022
微软官方文档:https://learn.microsoft.com/zh-cn/dotnet/core/extensions/windows-service?pivots=dotnet-7-0
最近公司需要使用后台调度服务定时拉取业务数据并推送至第三方,原本是直接使用aps.net core应用程序部署在IIS上,然后出现了不定时运行终止的情况,经过排查后发现是因为IIS有一个特定的机制:应用程序池空闲一段时间后会自动终止。然后就想把应用程序部署成windows后台服务,这样就不会停止了,linux使用docker部署应该是没有问题
一、创建Windows服务
创建辅助角色服务项目
(1)打开【visual studio】,然后选择【辅助角色服务】,点击下一步

(2)调整为自己的项目名称,此处我就不做更改了,框架选择.net7,使不使用顶级语句看个人习惯,我这里选择使用顶级语句,最后点击创建


创建好的目录如下:【Program.cs】为主入口,【Worker.cs】为服务启动后执行的逻辑

(3)引用相关nuget包,引用后代码修改如下,其中结构参照了应用程序的结构,但不影响正常使用
- 【Microsoft.Extensions.Hosting.WindowsServices】:用于配置成windows服务
- 【Serilog.AspNetCore】:使用serilog记录日志
- 【Serilog.Sinks.Async】:使用异步记录日志




二、创建一键部署windows服务的批处理命令
(1)创建【InstallWindowsService.bat】批处理命令文件,命令如下,注意文件属性要标识复制到生成目录,不然打包后会没有文件
@echo off
chcp 65001
REM 设置服务唯一标识
set "SERVICE_NAME=bitify job backservice"
REM 设置服务显示名称
set "DISPLAY_NAME=bitify job backservice"
REM 设置服务描述备注
set "DESCRIPTION=任务管理后台服务"
REM 获取当前目录
set "APP_PATH=%~dp0"
REM 设置服务运行程序
set "APP_EXE=job.backservice.exe"
REM 预删除
sc stop "%SERVICE_NAME%"
sc delete "%SERVICE_NAME%"
sc create "%SERVICE_NAME%" binpath= "%APP_PATH%%APP_EXE%" DisplayName= "%DISPLAY_NAME%" start= auto
sc description "%SERVICE_NAME%" "%DESCRIPTION%"
sc start "%SERVICE_NAME%"
echo "Windows服务已正常运行"
pause

(2)打包后使用管理员运行批处理命令,运行成功后可以在windows服务看到此服务

(3)运行后发现程序目录没有产生日志,这是因为windows服务是在C:\Windows\System32运行的,在appsetting中没有指定绝对路径就会设置当前运行目录+相对路径
这里使用环境变量解决这个问题,对了,这里要加上UseSerilog




浙公网安备 33010602011771号