结合 .NET MVC 网站和 Windows 服务

Combine .NET MVC website and Windows services

我目前正在参与一个简单到中等复杂的物联网项目。我们应用程序的主要目的是从我们的设备收集数据并分析该数据以及计算统计数据。

在服务器端,我们 运行 一个 MVC 应用程序。到目前为止,我们使用 Hangfire 来安排计算。 Hangfire 是一个很棒的工具,用于安排电子邮件和其他简单的事情,对于更高级的事情它太慢了。计算可能会占用大量时间并且是处理器密集型的(尽管我们正在尝试优化它们),因此我们需要在后台任务中调用它们,一个简单的 API 调用是不够的。

我考虑过将应用程序分成多个部分,网站、核心和 windows 服务。

问题是,我以前从未尝试过,我不知道实现这种事情的最佳实践是什么。我搜索了示例和文章,但我找到的都是使用 Hangfire 的建议 and/or Quartz.NET.

有没有人知道构建 MVC 应用程序、Windows 服务的最佳实践以及它们如何通信(可能通过队列)?在这种情况下,最佳做法是什么?

虽然可能有许多不同的方法可以将站点与 windows 服务连接起来,但根据您的陈述,我可能会选择以下两种方法之一:

直接沟通

让您的站点向后端 windows 服务发送数据的一种方法是使用 WCF。该服务将公开一个端点。为简单起见,这可以是 basicHttpBinding 或 netTcpBinding。应根据您的具体要求进行选择;如果数据很小,那么 basicHttp 可能是 "sufficient".

这种方法的优点是需要的开销相对较少:您只需设置 windows 服务(无论如何您都必须这样做)并为 WCF 绑定打开一个端口.站点充当客户端,服务充当服务器。它没有什么特别之处,只是因为客户端是一个 MVC 站点。您几乎可以将任何 WCF 教程作为起点。

请注意,除了 WCF,您还可以使用其他技术,例如 .NET Remoting 甚至 sockets。就个人而言,我经常使用 WCF,因为我已经很习惯了,但是这个选择是基于个人意见的。

排队的通信

如果可靠性和完整性对​​您的项目至关重要,那么使用队列可能是个好主意。同样:根据您的需要,可能会考虑不同的产品。如果您不需要太多监控和开箱即用的管理好东西,那么即使是像 MSMQ 这样非常简单的技术也可能就足够了。

如果您对上述几点的要求更相关,那么也许您应该寻找其他东西。就在最近,我接触了 Service Bus for Windows Server (SBWS)。它是 Azure Service Bus 的小兄弟,可以在您的 windows 服务器上本地使用。它的好处是,它不收取额外费用,因为它已经获得了您的 windows 服务器许可证。

与第一点一样:MSMQ 和 SBWS 只是两个示例。可能还有很多其他产品,如 NServiceBusZeroMQ 或其他可用的产品,随便你说。