开发语言: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】批处理命令文件,命令如下,注意文件属性要标识复制到生成目录,不然打包后会没有文件
(2)打包后使用管理员运行批处理命令,运行成功后可以在windows服务看到此服务
(3)运行后发现程序目录没有产生日志,这是因为windows服务是在C:\Windows\System32运行的,在appsetting中没有指定绝对路径就会设置当前运行目录+相对路径
这里使用环境变量解决这个问题,对了,这里要加上UseSerilog