原文:Creating Windows Services In .NET Core – Part 2 – The “Topshelf” Way
做者:Dotnet Core Tutorials
译者:Lamond Lu
译文:使用.NET Core建立Windows服务(二) - 使用Topshelf方式html
使用.NET Core建立Windows服务shell
Topshelf
方式在前一篇文章中,我给你们介绍了,如何基于微软推荐方式使用.NET Core建立Windows服务。咱们发现使用这种方式,咱们很容易就能够搭建和运行一个Windows服务,可是问题是使用这种方式,代码调试将很是困难。c#
那么如今就是Topshelf
出场的时候了。Topshelf
是一个.NET Standard库,它消除了在.NET Framework和.NET Core中建立Windows服务的那些麻烦。api
与微软推荐方式相似,这里Visual Studio并无提供一个基于Topshelf
建立Windows服务的模板,因此咱们依然须要经过建立普通控制台程序的方式,来建立一个Windows服务。app
而后,咱们须要经过Package Manager Console, 运行如下命令,安装Topshelf
类库。学习
Install-Package Topshelf
下面咱们就来使用Topshelf
重构以前的服务代码。命令行
public class LoggingService : ServiceControl { private const string _logFileLocation = @"C:\temp\servicelog.txt"; private void Log(string logMessage) { Directory.CreateDirectory(Path.GetDirectoryName(_logFileLocation)); File.AppendAllText(_logFileLocation, DateTime.UtcNow.ToString() + " : " + logMessage + Environment.NewLine); } public bool Start(HostControl hostControl) { Log("Starting"); return true; } public bool Stop(HostControl hostControl) { Log("Stopping"); return true; } }
代码看起来是否是很简单?调试
这里咱们的服务类继承了ServiceControl
类(实际上并不须要,可是这能够为咱们的工做打下良好的基础)。咱们必须实现服务开始和服务结束两个方法,而且像之前同样记录日志。日志
在Program.cs
文件的Main
方法中,咱们要写的代码也很是的简单。咱们能够直接使用HostFactory.Run
方法来启动服务。code
static void Main(string[] args) { HostFactory.Run(x => x.Service<LoggingService>()); }
这看起来真是太简单了。但这并非HostFactory
类的惟一功能。这里咱们还能够设置
static void Main(string[] args) { HostFactory.Run(x => { x.Service<LoggingService>(); x.EnableServiceRecovery(r => r.RestartService(TimeSpan.FromSeconds(10))); x.SetServiceName("TestService"); x.StartAutomatically(); } ); }
这里其实能说的东西不少,可是我建议你仍是本身去看看Topshelf
的文档,学习一下其余的配置选项。基本上你能使用Windows命令行完成的全部操做,均可以使用代码来设置: https://topshelf.readthedocs.io/en/latest/configuration/config_api.html
和以前同样,咱们须要针对不一样的Windows环境发布咱们的服务。在Windows命令提示符下,咱们能够在项目目录中执行如下命令:
dotnet publish -r win-x64 -c Release
如今咱们就能够查看一下bin\Release\netcoreappX.X\win-x64\publish
目录,咱们会发现一个编译好的exe,下面咱们就会使用这个文件来安装服务。
在上一篇文章中,咱们是使用SC
命令来安装Windows服务的。使用Topshelf
咱们就不须要这么作了,Topshelf
提供了本身的命令行参数来安装服务。基本上使用代码能完成的配置,均可以使用命令行来完成。
你能够查看相关的文档:
<http://docs.topshelf-project.com/en/latest/overview/commandline.html>
WindowsServiceExample.exe install
这里WindowsServiceExample.exe
是我发布以后的exe文件。运行以上命令以后,服务应该就正常安装了!这里有一个小问题,我常常发现,即便配置了服务自动启动,可是服务安装以后,并不会触发启动操做。全部在服务安装以后,咱们还须要经过如下命令来启动服务。
WindowsServiceExample.exe start
在生产环境部署的时候,个人经验是在安装服务以后,等待10秒钟,再启动服务。
当咱们是使用微软推荐方式的时候,咱们会遇到了调试困难的问题。大多数状况下,不管是否在服务内部运行,咱们都不得不使用命令行标志、#IF DEBUG
指令或者配置值来实现调试。而后使用Hack的方式在控制台程序中模拟服务。
所以,这就是为何咱们要使用Topshelf
。
若是咱们的服务代码已经在Visual Studio中打开了,咱们就能够直接启动调试。Topshelf
会模拟在控制台中启动服务。咱们应该能在控制台中看到如下的消息。
The TestService service is now running, press Control+C to exit.
这确实符合了咱们的需求。它启动了咱们的服务,并像真正的Windows服务同样在后台运行。咱们能够像往常同样设置断点,基本上它遵循的流程和正常安装的服务同样。
咱们能够经过ctrl+c, 来关闭咱们的应用,可是在运行服务执行Stop方法以前,它是不能被关闭的,这使咱们能够调试服务的关闭流程。与调试指令和配置标志相比,这要容易的多。
这里须要注意一个问题。若是你收到的如下内容的消息:
The TestService service is running and must be stopped before running via the console
这意味着你尝试调试的服务实际上已经做为Windows服务被安装在系统中了,你须要中止(不须要卸载)这个正在运行的服务,才能够正常调试。
在上一篇中,有读者指出.NET Core中实际上已经提供了一种彻底不一样的方式运行Windows服务。它的实质是利用了ASP.NET Core中引入的“托管服务”模型,并容许它们做为Windows服务来运行,这真的是很是的棒。