使用.NET Core创建Windows服务(二) - 使用Topshelf方式

原文:Creating Windows Services In .NET Core – Part 2 – The “Topshelf” Way
作者:Dotnet Core Tutorials
译者:Lamond Lu
译文:使用.NET Core创建Windows服务(二) - 使用Topshelf方式

使用.NET Core创建Windows服务



在前一篇文章中,我给大家介绍了,如何基于微软推荐方式使用.NET Core创建Windows服务。我们发现使用这种方式,我们很容易就可以搭建和运行一个Windows服务,但是问题是使用这种方式,代码调试将非常困难。

那么现在就是Topshelf出场的时候了。Topshelf是一个.NET Standard库,它消除了在.NET Framework和.NET Core中创建Windows服务的那些麻烦。

安装

与微软推荐方式类似,这里Visual Studio并没有提供一个基于Topshelf创建Windows服务的模板,所以我们依然需要通过创建普通控制台程序的方式,来创建一个Windows服务。

然后,我们需要通过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方法来启动服务。

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服务来运行,这真的是非常的棒。

原文地址:https://www.cnblogs.com/lwqlun/p/11625789.html

时间: 2024-10-18 04:59:56

使用.NET Core创建Windows服务(二) - 使用Topshelf方式的相关文章

.NET Core 创建Windows服务

.NET Core 创建Windows服务 作者:高堂 原文地址:https://www.cnblogs.com/gaotang/p/10850564.html 写在前面 使用 TopShelf+Autofac+AutoMapper+Quartz+NLog 完成现有项目定时调度任务 1.相关NetGet包 依赖注入 Alexinea.Autofac.Extensions.DependencyInjection 对象映射 AutoMapper.Extensions.Microsoft.Depend

使用.NET Core创建Windows服务(一) - 使用官方推荐方式

原文:Creating Windows Services In .NET Core – Part 1 – The "Microsoft" Way 作者:Dotnet Core Tutorials 译者:Lamond Lu 译文:使用.NET Core创建Windows服务(一) - 使用官方推荐方式 创建Windows服务来运行批处理任务或者运行后台任务,是一种非常常见的模式,但是由于云服务(Amazon Lambda, Azure WebJobs以及Azure Functions)的

C#创建windows服务、调试、安装

 一.创建Windows服务  二.调试windows程序  三.发布windows程序 如果安装有问题可以使用下面工具进行安装 window服务安装工具下载 示例源码

(转)创建Windows服务(Windows Services)N种方式总结

转自:http://www.cnblogs.com/aierong/archive/2012/05/28/2521409.html 最近由于工作需要,写了一些windows服务程序,有一些经验,我现在总结写出来.目前我知道的创建创建Windows服务有3种方式:a.利用.net框架类ServiceBaseb.利用组件Topshelfc.利用小工具instsrv和srvany 下面我利用这3种方式,分别做一个windows服务程序,程序功能就是每隔5秒往程序目录下记录日志: a.利用.net框架类

创建Windows服务(Windows Services)N种方式总结

最近由于工作需要,写了一些windows服务程序,有一些经验,我现在总结写出来.目前我知道的创建创建Windows服务有3种方式:a.利用.net框架类ServiceBaseb.利用组件Topshelfc.利用小工具instsrv和srvany 下面我利用这3种方式,分别做一个windows服务程序,程序功能就是每隔5秒往程序目录下记录日志: a.利用.net框架类ServiceBase 本方式特点:简单,兼容性好 通过继承.net框架类ServiceBase实现 第1步: 新建一个Window

使用.Net Core 2.2创建windows服务

使用.Net Core 2.2创建windows服务 我的环境 win 10 home Visual Studio 2019 v16.1.3 安装有.net core 2.2 创建项目 编辑项目文件 在 PropertyGroup 配置节 加入属性 <RuntimeIdentifier>win-x64</RuntimeIdentifier> 保存后,重新生成项目 在项目文件夹下,会有文件夹 bin\Debug\netcoreapp2.2\win-x64,里面包含了exe文件. 测试

Topshelf创建Windows服务

使用Topshelf创建Windows服务 概述 Topshelf是创建Windows服务的另一种方法,老外的一篇文章Create a .NET Windows Service in 5 steps with Topshelf通过5个步骤详细的介绍使用使用Topshelf创建Windows 服务.Topshelf是一个开源的跨平台的宿主服务框架,支持Windows和Mono,只需要几行代码就可以构建一个很方便使用的服务宿主. 引用安装 1.官网:http://topshelf-project.c

PowerShell创建Windows服务

旧服务器要淘汰,上面的自定义的Windows服务要迁移: 一.创建服务 (1)将自定义的Windows服务所需要的文件复制到新服务器上: (2)使用powershell在新服务器上创建新的Windows服务,命令如下: new-service –Name OrderService –DisplayName OrderService –BinaryPathName "D:\order\OrderService.exe" –StartupType Automatic (3)检查创建成功:

杂记2:VS2013创建Windows服务实现自动发送邮件

这篇随笔里,我将介绍如何用VS2013开发Windows服务项目,实现的功能是定时发送电子邮件. 开发环境:VS2013,SQL Server2008,采用C#语言开发 步骤一:创建Windows服务项目 首先,有人提问VS2013找不到创建Windows服务项目的选项,答案是在“Windows 桌面”目录下: 步骤二:重命名服务,添加Timer组件 重命名默认创建的Service1服务,比如MyMailService:然后在设计界面添加Timer组件. 这里要注意,VS工具箱默认提供的是Sys