本文详细介绍Windows服务的开发与部署
一、服务项目搭建
1.新建一个Windows服务项目
然后会自动打开我们所添加服务的设计模式。
在解决方案管理器中右键Service1.cs,重命名为MyServices.cs
点击“单击此处切换到代码视图”或者在解决方案资源管理器中展开MyService.cs,双击MyService进入服务代码视图。
2.定时任务服务的一般通用模版
一般来说服务用于执行一些定时任务。因此服务中常用到的代码就是定时器了,在MyService中添加定时业务代码,即,在OnStart中创建并启动定时器,这块代码可以作为定时任务服务的通用的处理模版。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading.Tasks;
using System.Timers;namespace MyService
{public partial class MyService : ServiceBase{public MyService(){InitializeComponent();}protected override void OnStart(string[] args){// TODO: 在此处添加代码以启动服务。var timer = new Timer(1000 * 60) { AutoReset = true, Enabled = true }; //间隔1分钟timer.Elapsed += timer_Elapsed;timer.Start();}protected override void OnStop(){}private static bool IsExec = false;//定义服务是否正在运行状态private void timer_Elapsed(object sender, ElapsedEventArgs e){//执行定时任务var interval_time = Convert.ToInt32(ConfigurationManager.AppSettings["IntervalTime"] ?? "3");if (DateTime.Now.Minute % interval_time == 0 && !IsExec)//每隔3分钟执行一次//if (DateTime.Now.Hour==0 && DateTime.Now.Minute == 0 && !IsExec)//每天0点0分执行{try{IsExec = true;//你的业务代码//DoSomething();}catch (Exception ex){//抛出错误或者打印日志,注意:如果catch到异常服务会卡住(因为IsExec值为true不再改变),可根据自己业务需要是否加finally处理//LogHelper.Error("执行定时任务出错!" + ex.Message);}//finally//{// //IsExec = false;//}IsExec = false;}}}
}
tips:如果定时任务的间隔为分钟,并不是每分钟的0秒去执行timer_Elapsed方法的,而是以启动服务时的时间为准。比如,间隔为1分钟,服务启动时为09:05:30,那么每次执行timer_Elapsed方法的时间都是每分钟的30秒,而不是0秒。
二、Windows服务的部署
1.定义服务的名称和描述,以及服务的运行账户
在服务的设计模式视图中“右键→添加安装程序”,会自动添加一个安装程序文件,名称为ProjectInstaller.cs
在ProjectInstaller.cs的设计视图中,serviceInstaller控制服务的名称描述等相关内容,serviceProcessInstaller控制服务运行的账户。
(1)serviceInstaller属性配置
右键serviceInstaller1→属性
我们需要重点关注的是这三个属性,
ServiceName:服务名称,简单来说就是服务在操作系统中的名称,即系统任务管理器中该服务的进程名称。
DisplayName:展示名称,说明见下图
Description:服务描述说明,说明见下图
DisplayName和Description
使用Win+R,输入services.msc,打开系统的服务管理器
一般来说ServiceName和DisplayName保持一致即可,可以加统一公司前缀,这样多个服务时便于查找。Description服务描述一定要写的,便于运维人员进行维护(没有描述的服务可能会被运维当初垃圾服务干掉)。
(2)serviceProcessInstaller属性配置
右键serviceProcessInstaller1→属性
我们需要重点关注的就一个Account属性,改属性默认值是User(这里是个坑,因为选择为User的服务在启动时需要输入账户用户名和密码),这里我们需要调整为LocalService即可。
2.服务的安装
windows服务的安装需要使用到InstallUtil.exe,这个文件路径如下,
InstallUtil.exe(x86) C:\Windows\Microsoft.NET\Framework\v4.0.30319
InstallUtil.exe(x64) C:\Windows\Microsoft.NET\Framework64\v4.0.30319
使用x86安装还是x64安装取决与项目配置,右键项目,选择属性
为方便期间,我们把项目对应的InstallUtil.exe拷贝到我们的项目中。
同理再新建两个2个bat文件用于安装和卸载服务,也拷贝到项目中去
Install.bat
%~dp0InstallUtil.exe %~dp0项目名称.exe
Net Start 服务名称
sc config 服务名称 start= auto
pause
Uninstall.bat
%~dp0InstallUtil /u %~dp0项目名称.exe
pause
项目名称:该WinService服务项目的名称
服务名称:是serviceInstaller1中配置的ServiceName
把这3个文件粘贴到项目中以后,选中,右键属性
复制到输出目录,选择始终复制。
右键项目,生成,然后到项目目录下的打开bin文件夹,根据生成方式,选择Debug/Release文件夹
将里边的内容拷贝到服务器。执行Install.bat即可进行安装
注意,win2008及以上系统,执行安装卸载bat需要管理员权限运行:即右键Install.bat/Uninstall.bat→以管理员身份运行。
本文链接:https://my.lmcjl.com/post/6740.html
4 评论