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

Port reading application in .Net which is better Windows service or Windows application

我正在 .Net 中编写一个 TCP/IP 端口读取应用程序以从 IOT 设备读取数据,目前它是 运行 作为一个 Windows 应用程序。我想把它做成 Windows 服务,有没有更好的选择?我想全天候阅读端口 24/7。有没有比 Windows 服务更好的选择?

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

作为侧节点,您可以在作为服务启动和作为应用程序启动之间更改带有调试标志的应用程序。添加一个 Service-Class 到您的应用,另一个 class 用于您的自定义代码。该服务还将调用示例 class。然后,如果在 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
    }

然后,如果您启动应用程序,请在构建和调试之间进行选择。但是您只能通过这种方式将发布版本安装为服务。

是的,windows 服务就可以了。我想使用一个名为 TopShelve to make a service / console app. Then I'd add NancyFx 的小库来公开服务及其数据(或从共享数据库中读取)。

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

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

您要求 "better option",这是一个替代选项,但它是否更好将在很大程度上取决于您的要求:那么,作为替代方案,您是否考虑过任务计划程序?

我在 .NET 中有许多命令行应用程序,我可以 运行 并在 Visual Studio 中进行调试,然后在需要时由任务调度程序调用 运行 定期。如果您想使用任务调度程序,那么只需确保它不需要任何用户交互(也不需要 gui),但同样的限制也适用于服务。如果它是一个很长的 运行ning 应用程序(你的似乎是),那么你可以使用任务调度程序将它设置为 运行ning,如果你愿意,你可以使用任务管理器定期重新启动如果它还不是 运行ning.

有些事情服务更合适。当然,它们比 运行 停止任务调度程序更容易停止(因为对于任务调度程序,您必须在任务管理器中找到进程才能终止它)。

可能值得考虑为什么要将其 运行 作为一项 windows 服务。如果它只是作为一种在您的机器启动时设置它 运行ning 的方法,那么计划任务也一样好。如果是因为您想获得编写 windows 服务的经验,那么请将其作为 windows 服务来编写。等等

选择一个或另一个的原因可能有多种,但这里有一些建议可能会帮助您做出决定。

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

确保将所有可配置值放入配置文件中。例如监听端口、间隔或任何其他您可能想更改而无需重新编译/重新部署的东西,因为您没有 UI 来控制它。

您还可以将所有这些设置存储在 json 或 xml 文件中,您可以为其创建一个单独的 UI 来管理该设置文件,而 windows 服务只读取这些设置。

更进一步,您还可以将代码添加到您的 windows 服务中,启动过程 web api 端点响应休息请求以操纵服务配置 and/or actions/commands 您可能想要交付给您的 windows 服务。这将允许 windows 服务在有或没有用户会话的情况下在后台 运行 并且也可以通过 rest 调用从单独的机器控制。

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

应用程序是您在桌面上与之交互的程序。

Microsoft Windows 服务专门设计用于解决 24/7 服务正常运行时间问题并摆脱面向 GUI 的表单应用程序, C# 提供了非常好用且易于使用的示例,说明如何开发 Windows 服务。与错误记录器系统一起,它可以成为您解决方案不可或缺的一部分。 为了让你的 Windows 服务对调试器友好,你可以把它放在

Topshelf technology.I 根据我的经验,它大大减少了 development/debugging 时间。

为什么要重新造轮子? 您可以使用 WinDivert :

allows user-mode applications to capture/modify/drop network packets sent to/from the Windows network stack

can be used to implement user-mode packet filters, packet sniffers, firewalls, NAT, VPNs, tunneling applications, etc

您可能会在 C# 或 .NET 中使用它