如何将.Net Core程序作为Windows服务运行

使用.Net Framework 构建一个运行为Windows服务的应用程序非常简单。您可以在控制台应用程序中覆盖ServiceBase类,也可以使用TopShelf之类的抽象库来简化实现。无论您采用何种路线,您都有一个编程模型,涵盖服务的整个生命周期,从初始注册到运行,暂停和停止。

在.Net Core中没有直接支持创建Windows服务。该ServiceBase类已被排除在执行的,大概是因为它包含了什么应该是一个跨平台的框架太多的Windows实现细节。

ASP.Net Core确实公开了一个API,允许您将Web应用程序作为Windows服务运行,但这不能应用于简单的控制台应用程序。如果您想创建一个没有运行ASP.Net的服务,那么您有三个主要选项:

  • 使用NSSM等服务管理器来管理服务的注册和运行。
  • 在.Net Core中用P Invoke以直接进行必要的Windows调用
  • 将您的应用程序实现为.Net标准库并将其托管在.Net Framework服务应用程序中

使用服务管理器(service manager )

在.Net Core中创建Windows服务的最直接方法是创建一个简单的控制台应用程序,并使用像NSSM这样的外部服务管理器来处理服务方面。您甚至不必为Windows编译.Net Core控制台应用程序,因为NSSM可以配置为调用批处理文件。

要将.Net Core应用程序安装为Windows服务,只需在应用程序根目录中创建一个名为 run.bat 的批处理文件,该文件包含以下命令:

dotnet run

您可以通过将NSSM.EXE放入应用程序目录并运行以下命令,将此批处理文件注册为名为“testservice”的Windows服务:

nssm install testservice  

这将显示安装对话框,您可以在其中输入Path字段中run.bat文件的完整路径。

使用外部服务管理器的问题是,除了注册和启动服务之外,没有直接支持处理服务生命周期的各个方面。最重要的是,ServiceBase中没有等效的OnStop事件允许您在服务停止时优雅地清理资源。当进程结束或控制台窗口关闭时,甚至没有可靠的事件可以挂钩。

使用基于NSSM的服务,挂钩服务停止的唯一方法是拦截CTRL + C命令 – 这可以在.Net Core中使用Console对象获得,如下所示:

Console.CancelKeyPress += Console_CancelKeyPress;

private static void Console_CancelKeyPress(object sender, ConsoleCancelEventArgs e)
{
    // Put your clean-up code here
}

使用NSSM注册服务时,请确保将其配置为在关闭服务时发出CTRL + C命令。这是默认完成的,但您可以通过查看服务注册表对话框上的ShutDown选项卡来检查它:

如何将.Net Core程序作为Windows服务运行 1

请注意,虽然这允许您在服务停止时进行清理,但此方法只能支持可以打开和关闭的基本服务。仍然不支持服务生命周期的其他方面,包括暂停,继续和响应电源事件。

使用 P/Invoke 模拟 ServiceBase

另一个选择是通过将一堆 P / Invoke 调用封装到.Net标准库中来直接模仿ServiceBase。有一个可用的基本实现,允许您实现一个自包含的Windows服务应用程序,该应用程序处理注册以及公开Start()和Stop()方法。它目前不支持任何其他事件,但如果您动手能力强,可能随时扩展。

通过这种方法来实现功能虽然很聪明,但感觉有点像一个Demo实验,而并不能真实的用于实际项目中。如果你将.net core应用程序做为windows 服务方式使用,那一开始就不应该使用 .net core来开发此服务程序,这也失去了.net core跨平台的意义。

与.Net Framework服务主机妥协

如果您希望实现响应所有服务事件,那么您当前需要将其实现为源自ServiceBase的.Net Framework应用程序。您仍然可以将您的功能实现为.Net Standard 2.0库,并使用基于.Net 4.6.1的轻量级应用程序作为应用程序的主机。

这可以被视为一种巧妙的妥协。您正在跨平台库中实现您的功能并保持选项打开,但您仍然可以实现可响应所有服务事件的Windows服务。

原文出处:http://www.ben-morris.com/running-a-net-core-console-application-as-a-windows-service/

源自机器翻译并做简单修正。

User Review
0 (0 votes)
本站最新优惠

Namesilo优惠:新用户省 $1 域名注册-优惠码:45D%UYTcxYuCloZ 国外最便宜域名!点击了解更多

特别优惠:免费赠送 $100 Vultr主机-限时优惠!英文站必备海外服务器!点击了解更多

VPS优惠:搬瓦工优惠码:BWH3OGRI2BMW 最高省5.83%打开外面世界的一款主机点击了解更多

原创文章,作者:江小编,如若转载,请注明出处:https://jhrs.com/2019/26915.html

扫码关注【江湖人士】公众号,您会获得关于国外被动收入的最新资讯

WA付费会员QQ群:387027533,加这个群需要回答您的WA会员名,待核实后予以通过

普通QQ交流群:178758794,可分享交流建站的各类经验和知识

发表评论

电子邮件地址不会被公开。 必填项已用*标注

6 + 9 =