加入收藏 | 设为首页 | 会员中心 | 我要投稿 厦门网 (https://www.xiamenwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长百科 > 正文

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

发布时间:2021-01-08 02:28:02 所属栏目:站长百科 来源:网络整理
导读:原文:Creating Windows Services In .NET Core – Part 1 – The “Microsoft” Way 作者:Dotnet Core Tutorials 译者:Lamond Lu 译文:使用.NET Core创建Windows服务(一) - 使用官方推荐方式 创建Windows服务来运行批处理任务或者运行后台任务,是一种
副标题[/!--empirenews.page--]

原文:Creating Windows Services In .NET Core – Part 1 – The “Microsoft” Way
作者:Dotnet Core Tutorials
译者:Lamond Lu
译文:使用.NET Core创建Windows服务(一) - 使用官方推荐方式

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

创建Windows服务来运行批处理任务或者运行后台任务,是一种非常常见的模式,但是由于云服务(Amazon Lambda,Azure WebJobs以及Azure Functions)的激增,你可能不会经常使用Windows服务了。个人而言,我非常喜欢使用Azure WebJobs,因为我可以直接编写一个控制台程序,而不需要考虑如何云中运行它,一个批处理文件可以将其装换成一个自动化任务,并且可以保证7*24小时的运行。

但是也许你还没有使用云服务,或者你有一堆要作为Windows服务运行的旧版应用程序需要转换为.NET Core,但是不能完全将他们转换为“无服务器”(serverless)应用。 那么这边文章就是适合你的。

在许多方面,.NET Core中的Windows服务和.NET Framework中的Windows服务完全相同。但是,在编写服务的时候,你可能会遇到一些小问题。此外,本文中,我们仅介绍“Microsoft”方式的Windows服务创建,在后续,我会继续介绍如何使用第三方库TopShelf来简化这该过程。

安装

由于Visual Studio没有提供创建Windows服务的模板,所以我们需要通过创建控制台程序的方式来创建一个Windows服务。

创建完成之后,我们需要安装一个Nuget程序包,这个程序包会将一些Windows特定的API添加到.NET Core中,这些API实际上已经在完整框架中提供了,但是其中许多是Windows特有的,例如Windows服务。因此,它们并没有包含在.NET Core的基础库中,但是可以通过将Nuget程序包的方式引入到.NET Core中。
下面我们就可以在Package Manager Console中输入以下命令。

Install-Package Microsoft.Windows.Compatibility

代码

以上引入的Nuget程序包中,最让我们感兴趣的是ServiceBase类。这是一个用于编写Windows服务的基类,它提供了一系列的事件钩子,包含服务启动、结束、暂停等。

下面呢,我们将在代码中创建一个类,这个类负责将一些简单的日志输出到一个临时文件中。我们将使用这个例子来了解其中的原理。我们的代码如下:

class LoggingService : ServiceBase
{
    private const string _logFileLocation = @"C:tempservicelog.txt";
 
    private void Log(string logMessage)
    {
        Directory.CreateDirectory(Path.GetDirectoryName(_logFileLocation));
        File.AppendAllText(_logFileLocation,DateTime.UtcNow.ToString() + " : " + logMessage + Environment.NewLine);
    }
 
    protected override void OnStart(string[] args)
    {
        Log("Starting");
        base.OnStart(args);
    }
 
    protected override void OnStop()
    {
        Log("Stopping");
        base.OnStop();
    }
 
    protected override void OnPause()
    {
        Log("Pausing");
        base.OnPause();
    }
}

所以这里你会注意到,我们的类是继承了ServiceBase类,并且我们重写了几个事件方法,输出了一些日志。在服务启动时,会触发OnStart事件,在服务终止的时候,会触发OnStop事件。这里我们不应该将过于繁重的任务放置在OnStart事件中来处理。

如果我们想从Main方式中启动这个服务,代码非常的简单。

static void Main(string[] args)
{
    ServiceBase.Run(new LoggingService());
}

以上就是全部代码。

服务部署

在发布服务的时候,我们不可能仅依靠Visual Studio来构建我们所需要的服务,我们还需要专门针对Windows运行时进行构建。为此,我们需要在项目根目录的命令提示符下运行以下命令。注意,这里我们传入了一个-r标记来告诉它要构建那个平台。

dotnet publish -r win-x64 -c Release

命令运行完毕之后,我们可以检查以下/bin/release/netcoreappX.X/publish目录,我们可以找到所有的发布代码,但是最重要的是,这里我们可以得到一个可执行的exe文件。如果我们不指定运行时,我们只会获得一个.NET Core的dll程序集,使用这个程序集,我们是没有办法创建Windows服务的。

现在我们可以将这个发布目录移动带其他的任何地方,但是现在我们就暂时使用当前的发布目录。

下一步,我们需要使用管理员角色打开一个命令提示符,然后输入一下命令。

sc create TestService BinPath=C:fullpathtopublishdirWindowsServiceExample.exe

SC命令是一个标准的Windows命令(与.NET Core无关),它可以用来安装Windows服务。这里我们将我们的测试服务命名为TestService,更重要的是,我们通过BinPath参数指定了可执行exe文件。

运行之后,我们应该会得到以下结果。

[SC] CreateService SUCCESS

然后我们要做的就是启动服务。

sc start TestService

现在我们可以查看一下我们的日志文件,查看服务的运行情况。

如果想要停止并删除服务,我们可以使用一下命令。

sc stop TestService
sc delete TestService

服务调试

在这里,我真的认为,使用"Microsoft"的方式注定会失败。因为调试服务实在是太繁琐了。

(编辑:厦门网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读