为了部署的方便,我们开发Windows服务的服务寄宿程序,这样我们的服务便可以作为系统服务,随着系统的启动和关闭而启动和关闭,而避免了其他的设置,同时在服务的终止时(如系统关闭等)能及时处理服务的关闭事件。
在解决方案中,新建一个Windows服务,如下图所示:
打开Service服务的设计界面,右键"添加安装程序"
右键选择"属性",打开属性侧边栏,可以修改服务的属性信息(如名称)
修改ServiceProcessInstaller和ServiceInstaller的属性信息
下面我们针对Service的OnStart和OnStop进行编码
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Linq; using System.ServiceModel; using System.ServiceModel.Description; using System.ServiceProcess; using System.Text; using System.Threading.Tasks; namespace InChatter.Service.WSHost { public partial class InChatterService : ServiceBase { private ServiceHost _Host; public InChatterService() { InitializeComponent(); } protected override void OnStart(string[] args) { try { Uri baseUri = new Uri("http://localhost:1378/InChatter"); _Host = new ServiceHost(typeof(Chat), baseUri); NetTcpBinding binding = new NetTcpBinding(); binding.Security.Mode = SecurityMode.None; binding.ReceiveTimeout = TimeSpan.FromHours(2); _Host.AddServiceEndpoint(typeof(IChat), binding, "net.tcp://localhost:1121/InChatter"); _Host.Description.Behaviors.Add(new ServiceMetadataBehavior { HttpGetEnabled = true }); _Host.Open(); } catch (Exception ex) { EventLog log = new EventLog(); log.Source = "InChatterService"; log.WriteEntry(ex.Message, EventLogEntryType.Error); } } protected override void OnStop() { if (_Host.State != CommunicationState.Closed) { _Host.Close(); } } } }
下面给出两个服务的安装和卸载的.bat文件,大家参考
1.Installer
@ECHO OFF echo 准备安装服务 REM The following directory is for .NET 4.0 set DOTNETFX2=%SystemRoot%\Microsoft.NET\Framework\v4.0.30319 set PATH=%PATH%;%DOTNETFX2% echo 安装服务... echo --------------------------------------------------- InstallUtil /i InChatter.Service.WSHost.exe echo --------------------------------------------------- net start InChatterService pause
其中net start 服务名
在安装的最后过程,我们启动服务
2.Uninstaller
@ECHO OFF echo 准备卸载服务 net stop InChatterService REM The following directory is for .NET 4.0 set DOTNETFX2=%SystemRoot%\Microsoft.NET\Framework\v4.0.30319 set PATH=%PATH%;%DOTNETFX2% echo 卸载服务... echo --------------------------------------------------- InstallUtil /u InChatter.Service.WSHost.exe echo --------------------------------------------------- pause
在卸载的初期,我们先关闭服务,这样可以确保服务的完整性和稳定性。
我们将上述的安装和卸载过程保存为.bat文件,添加到项目过程中,并将其属性设置如上所示
这样在编译程序时,.bat文件将和服务的.exe程序一起处于同一目录下,如此在部署时,可以直接点击安装或者卸载批处理来完成相应的操作