.Net中的端口读取应用程序是更好的Windows服务或Windows应用程序

.Net中的端口读取应用程序是更好的Windows服务或Windows应用程序

问题描述:

我正在写.Net中的TCP/IP端口读取应用程序以读取来自IOT设备的数据,目前它正在作为Windows应用程序运行。我想让它成为Windows服务,有没有更好的选择?我想阅读端口24/7。有没有比Windows服务更好的选择?.Net中的端口读取应用程序是更好的Windows服务或Windows应用程序

+2

如果你想成为一个窗口服务,那么这就是对你们显然是更好的选择可能使用它。在这里没有客观的措施,当然不是您目前提供的详细程度。 –

+2

如果需要网络资源,则在LocalSystem或NetworkService下运行Windows服务。如果音量较高或设备数量较多,请在两者之间建立数据集成/消息通道,像Kafka一样确保您不会丢失数据。 –

+0

对于开发和调试Windows应用程序更好,但对于发布我会去Windows服务 - 显然如果你在生产环境中的控制台窗口很好win应用程序是好的。 – jabko87

是的,一个Windows服务将会很好。我想用一个名为TopShelve的小库来制作服务/控制台应用程序。然后,我会添加NancyFx来公开服务和它的数据(或从共享数据库中读取它)。

您还问是否有更好的方法。您可能会争辩说,轮询所有物联网设备不是一个好主意(您可能会使用太多的资源)。让他们将他们的阅读(当他们认为合适时)广播给消息队列(大多数这些小设备喜欢使用MQTT)。然后,您的应用程序只应订阅所需的队列并在需要时处理数据。

如果您希望能够在没有用户登录的情况下运行程序,那么Windows服务就是您的选择。如果你想要一些图形用户界面,一个普通的应用程序更有用。

作为一个侧面节点,您可以使用调试标志在启动为服务和作为应用程序启动之间更改应用程序。为您的应用程序和另一个类添加服务类以获得自定义代码。该服务也将调用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 
    } 
的工作方式不同输出添加代码

然后,如果你启动应用程序之间选择生成和调试。但是你只能以这种方式安装发布版本。

+1

我喜欢这种设计。建议在作为服务运行时登录到[Windows事件日志](https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.eventlog?view=netframework-4.7.1) 。这是Windows服务的常见做法,可以使生产服务的故障排除更加容易。例如,如果捕获到一个'Exception',你可以把它作为一个错误写入带有完整堆栈跟踪的'EventLog' [如果需要的话]。 – Zer0

我没有使用.NET编写服务的经验,而且我一直觉得调试起来很棘手。

你问过一个“更好的选择”,这是一个替代选择,但它是否更好取决于你的要求:所以,作为替代方案,你是否考虑过任务调度程序?

我在.NET中有很多命令行应用程序,我可以在Visual Studio中运行和调试,然后在需要定期运行时由任务调度程序调用。如果你想使用任务调度器,那么只要确保它不需要任何用户交互(并且不需要gui),但是相同的限制将适用于服务。如果它是针对长时间运行的应用程序(您似乎是),那么您可以使用任务计划程序将其设置为正在运行,如果您想要,可以使用任务管理器定期重新启动它,如果它尚未运行。

服务更适合某些事情。当然,它们比任务调度程序中的某些东西更容易停止(因为对于任务调度程序,您必须在任务管理器中找到该进程来杀死它)。

这可能值得考虑为什么你想让它作为Windows服务运行。如果只是在设备启动时将其设置为运行状态,那么计划任务就会一样好。如果是因为你需要编写Windows服务的经验,那么将其作为Windows服务来使用。等等

可以有多种选择其中一种的理由,但这里有一些建议可以帮助您做出决定。

你提到24/7,所以Windows服务应该是你的选择毫无疑问。 但你需要考虑以下

确保你把你所有的配置值在配置文件中。例如,监听端口,时间间隔或任何其他你可能想改变而不重新编译/重新部署的东西,因为你没有UI来控制它。

你也可以有存储在一个JSON或XML文件中的所有这些设置,您可以创建一个单独的UI只是为了管理,设置文件,而窗口服务工作只是从这些设置读取。

更进一步,您还可以将代码添加到您的Windows服务中,启动进程web api端点,响应其他请求来操纵服务配置和/或您可能想要传递给Windows服务的操作/命令。这将允许windows服务在有或没有用户会话的情况下在后台运行,并且还可以通过其他呼叫来从单独的机器进行控制。

但这些都只是一些想法多少你做取决于你需要多少做。

应用程序是您在桌面上进行交互的程序。

Microsoft Windows服务专为解决全天候服务正常运行时间问题而设计,远离面向GUI的表单应用程序,C#提供了非常好且易于使用的如何开发Windows服务的示例。与错误记录系统一起,它可以成为您解决方案的组成部分。 为了让你的Windows服务更加友好,你可以把它放在

Topshelf技术。我在我的经验中使用它,它大大减少了开发/调试时间。

为什么重建车轮? 您可以使用WinDivert

允许用户模式应用程序捕获/修改从Windows网络堆栈

可以用来发送到/ /分支网络的数据包实现用户模式的分组过滤器,包嗅探器,防火墙,NAT,虚拟专用网,隧道应用等

您可以用C#或.NET

+0

他需要“在.Net中编写TCP/IP端口读取应用程序以从IOT设备读取数据”,运行WinDivert有助于实时在TCP/IP网络流中进行交互,他还可以使用自定义过滤器来检测物联网网络数据包,并在触发时读取/重建相关数据... –