1、vs2022新建一个windows服务项目
2、修改服务参数
(1)AutoLog: 是否将事件写入到windows的事件日志中。
(2)canpauseandContinue:服务是否可以暂停和继续
3、添加服务安装程序 在界面内右击鼠标 新建一个服务、新建后如下图:
4、选中serviceProcessInstaller1点右键,选择“属性”,打开serviceProcessInstaller1的属性面板:
Account:指示用来运行此服务的账户类型,默认选择User,修改为高权限的LocalSystem
5、
选中serviceInstaller1点右键,选择“属性”,打开serviceInstaller1的属性面板
- ServiceName:在Windows服务里面显示的名称
- Description:在Windows服务里面显示的描述信息
- StartType:指示启动此服务的方式和时间 Manual:手动启动 Automatic:自动启动
- DelayedAutoStart:指示服务是否延时启动,默认false,改为True,则表示服务延时启动
二、安装和卸载Windows服务
1、在命令行下面执行“installutil+生成的可执行文件的路径”的命令进行安装
2、卸载Windows服务:
在命令行里面输入“installutil /u 可执行文件路径”命令,然后回车
服务安装步骤:
1、使用管理员权限运行CMD;
备注:安装和卸载时我们都需要用到微软提供的工具InstallUtil.exe
默认位置在:C:\Windows\Microsoft.NET\Framework
2、安装服务
C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe D:\2.Package\c#\Text\WindowsService.FirstS\bin\Debug\WindowsService.FirstS.exe
D:\2.Package\c#\Text\WindowsService.FirstS\bin\Debug 为应用程序的物理路径。
3、卸载服务
卸载服务和安装服务的区别主要在 /u
C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe /u D:\2.Package\c#\Text\WindowsService.FirstS\bin\Debug\WindowsService.FirstS.exe
卸载应用程序的路径:D:\2.Package\c#\Text\WindowsService.FirstS\bin\Debug
注意:启动和终止服务可以封装成两个.bat 文件来进行注册和卸载服务。
4、启动服务指令如下:
Net start ServiceName
备注:如果需要跟随系统启动需要设置服务的启动方式为自动。
5、终止服务指令如下:
Net Stop ServiceName;
无法调试需要将当前程序附加到一个进程中
使用和调试服务程序时需要进行停止服务后然后在继续运行
如果封装成服务并且使用json配置文件,注意json的存放路径,如果设置
var config = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("AppSettings.json", false, true).Build();
则必须将json文件放置到"C:\Windows\SysWOW64"目录下
三、使用Net6新建服务
首先新建一个项目
完成之后,安装nuget包(一个是windows服务, 一个是linux服务)
Install-Package Microsoft.Extensions.Hosting.WindowsServices
Install-Package Microsoft.Extensions.Hosting.Systemd
项目完成后,打包生成。
work services项目介绍:
Worker Service是微软提供的一个项目模板,它继承于BackgroundService。在使用.NET Framework时,我们可以使用Windows Service来创建Windows服务,而在使用.NET Core及更高的.NET版本时,就可以使用Worker Service来取代Windows Service,以便创建跨平台服务。
项目创建成功后,windows会预设一个worker Service的模板,它主要文件为program.cs和worker.cs 提供了服务的启动入口,而work则是服务的具体功能实现。
打开program.cs可以看到 他使用了CreateHostBuilder方法返回了一个田间Worker类作为托管服务的host,然后调用它的Build方法生成实例并调用Run方法来运行该实例。整个Program.cs的结构与普通的控制台应用程序基本相同。
应用过程
接下来我们来使用Worker Service创建一个简单Demo服务,具体实现功能就是在一个日志文件中定时记录一些消息。
首先我们创建一个InfoLogWorker类,并使其继承于BackgroundService类,并将Program配置的服务改成InfoLogWorker。
可以看到,BackgroundService提供了三个虚方法和一个抽象方法,我们需要对StartAsync、StopAsync和ExecuteAsync三个方法进行重写。
其中StartAsync会在服务开启时被调用,而StopAsync则是在服务停止时被调用,ExecuteAsync是必须要被实现的方法,它定义了服务运行时需要执行的操作。
在重写完成这个三个方法之后,我们再创建一个ILogger的只读字段,并在构造函数中获取它的实例,之后将会使用它在调试时打印出我们需要的信息。然后我们再定义一个ServiceRunningMethod方法,用以定义服务运行时需要实现的具体功能。
部署为服务运行
使用bat脚本进行部署
install.bat
set current_path=D:\Package\Code\C#\6.service\Text\Learn.Text01\Learn.Text01\bin\Debug\net6.0\
sc create WorkerServiceDemo binPath= "D:\Package\Code\C#\6.service\Text\Learn.Text01\Learn.Text01\bin\Debug\net6.0\Learn.text01.exe"
sc description WorkerServiceDemo "Text my server01"
sc config WorkerServiceDemo start= auto
sc start WorkerServiceDemo
unitstall.bat
sc stop WorkerServiceDemo
sc delete WorkerServiceDemo
异常:
提示错误1053:服务没有及时响应或控制请求。(有可能没有安装。net运行环境)
修改如下:
.ConfigureServices(services =>
{
var processModule = Process.GetCurrentProcess().MainModule;
if(processModule is not null) {
var pathtoExe = processModule.FileName;
var pathContetRoot = Path.GetDirectoryName(pathtoExe);
Directory.SetCurrentDirectory(pathContetRoot);
}
services.AddHostedService<Worker>();
})