使用.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选项卡来检查它:
请注意,虽然这允许您在服务停止时进行清理,但此方法只能支持可以打开和关闭的基本服务。仍然不支持服务生命周期的其他方面,包括暂停,继续和响应电源事件。
使用 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/
源自机器翻译并做简单修正。
【江湖人士】(jhrs.com)原创文章,作者:江小编,如若转载,请注明出处:https://jhrs.com/2019/26915.html
扫码加入电报群,让你获得国外网赚一手信息。