我正在.Net中编写一个TCP / IP端口读取应用程序来读取来自IOT设备的数据,目前它作为Windows应用程序运行。我想让它成为Windows服务,有更好的选择吗?我想24/7阅读端口。有没有比Windows服务更好的选择?
答案 0 :(得分:7)
如果您希望能够在没有用户登录的情况下运行程序,那么Windows服务就是您的选择。如果你想要一些图形用户界面,普通的应用程序会更有用。
作为辅助节点,您可以在作为服务启动和作为应用程序启动之间使用调试标志更改应用程序。将Service-Class添加到您的应用程序,并为您的自定义代码添加另一个类。该服务还将调用Sample类。然后,如果在Program.cs中添加预编译器#if DEBUG,则可以在调试期间切换使用每个
public static void Main()
{
#if DEBUG
SampleClass sc = new SampleClass();
sc.Start();
#else
ServiceBase[] servicesToRun = new ServiceBase[]
{
new SampleService ()
};
ServiceBase.Run(servicesToRun);
#endif
}
然后您还可以为每个构建类型
添加不同的输出代码 public static void WriteLog(string message, LogLevel logLevel)
{
#if DEBUG
Console.WriteLine(message);
#else
Trace.Write ($"{DateTime.Now:dd.MM.yyyy HH:mm:ss.fff} {message}");
#endif
}
然后,如果您启动应用程序,请在构建和调试之间进行选择。但是你只能以这种方式安装release-build作为服务。
答案 1 :(得分:2)
是的,Windows服务没问题。我想使用一个名为TopShelve的小库来制作服务/控制台应用程序。然后我添加NancyFx来公开服务及其数据(或从共享数据库中读取)。
您还询问是否有“更好”的方式。您可能会争辩说,轮询所有IoT设备并不是一个好主意(您可能会使用太多资源)。让他们将他们的阅读(当他们认为合适时)广播到一个消息队列(大多数小设备都喜欢使用MQTT)。然后,您的应用程序应该只订阅所需的队列并在需要时处理数据。
答案 2 :(得分:1)
选择其中一个可能有多种原因,但这里有一些可能有助于您做出决定的建议。
您提到24/7所以Windows服务应该是您的选择毫无疑问。 但是你需要考虑以下
确保将所有可配置值放在配置文件中。例如监听端口,间隔或您可能想要更改的任何其他内容,而无需重新编译/重新部署,因为您没有UI来控制它。
您还可以将所有这些设置存储在json或xml文件中,您可以为其创建单独的UI以管理该设置文件,而Windows服务只能从这些设置中读取。
要更进一步,您还可以使用启动进程web api端点向Windows服务添加代码,该端口响应休息请求以操作您可能希望提供给Windows服务的服务配置和/或操作/命令。这将允许Windows服务在有或没有用户会话的情况下在后台运行,也可以通过休息调用从单独的机器控制。
但这些只是一些想法,你做了多少取决于你需要做多少。
答案 3 :(得分:1)
应用程序是您在桌面上进行交互的程序。
Microsoft Windows服务专门用于解决24/7服务正常运行时间问题,并远离面向GUI的表单应用程序, C#提供了非常好用且易于使用的如何开发Windows服务的示例。与错误记录器系统一起,它可以是您的解决方案的组成部分。 为了使您的Windows服务对调试器友好,您可以将其置于
Topshelf技术。我根据自己的经验使用它,它大大缩短了开发/调试时间。
答案 4 :(得分:0)
我没有在.NET中编写服务的经验,而且我总觉得它很难调试。
你问了一个更好的选择",这是一个替代选择但是它是否更好将在很大程度上取决于你的要求:所以,作为一种选择,你考虑过任务调度程序吗?
我在.NET中有许多命令行应用程序,我可以在Visual Studio中运行和调试,然后在需要定期运行时由任务调度程序调用。如果您想使用任务调度程序,那么只需确保它不需要任何用户交互(并且没有gui),但是相同的限制将适用于服务。如果它是用于长时间运行的应用程序(您的应用程序似乎是这样),那么您可以使用任务计划程序将其设置为运行,如果您希望可以使用任务管理器定期重新启动它,如果它还没有运行
服务更适合某些事情。当然,它们比运行任务调度程序更容易停止(因为对于任务调度程序,您必须在任务管理器中找到要杀死它的进程)。
可能值得考虑为什么要将其作为Windows服务运行。如果它只是在机器启动时将其设置为运行的一种方式,那么计划任务也同样好。如果是因为您需要编写Windows服务的经验,那么请将其作为Windows服务。等
答案 5 :(得分:-1)
为什么重建车轮? 您可以使用WinDivert:
允许用户模式应用程序捕获/修改/丢弃发送到Windows网络堆栈的数据包
和
可用于实现用户模式数据包过滤器,数据包嗅探器,防火墙,NAT,VPN,隧道应用程序等
您可能可能将它与C#或.NET
一起使用