【问题标题】:Combine .NET MVC website and Windows services结合 .NET MVC 网站和 Windows 服务
【发布时间】:2016-04-23 14:31:54
【问题描述】:

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

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

我考虑将应用程序拆分为多个部分,网站、核心和 Windows 服务。

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

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

【问题讨论】:

  • 您还没有提到为什么需要(多个)Windows 服务。你想达到什么目标?假设:通过您的站点检索数据并根据后端服务中的数据进行一些计算?
  • 你说得对,我忘了提到我们所有的后台任务都需要一些时间,而且我们根本无法在对 MVC 应用程序的 api 调用期间完成所有工作。我适当地编辑了我的答案
  • 好吧,我还有一些问题 ;) 设备只是发布数据,不需要返回任何计算结果,是吗?所以这只是一个“一劳永逸”的动作?设备发布数据、站点联系服务、服务计算并在某处存储结果?然后稍后您或其他流程视图/流程或任何计算结果?所以我的问题的本质是:这是某种单向沟通还是结果会倒退?
  • 没错。设备发布数据并且不需要任何响应。必须处理来自每个设备的数据,但这不会花费很长时间,我们可以在 POST 调用期间执行此操作(尽管如果我们也可以在后台任务中执行此操作会很好:))。更高级的计算目前在夜间在后台任务中完成,但我们希望在达到条件后立即触发它们(例如正在收集特定数量的数据或将某些特定数据发送到服务器)。设备只需要发送数据并知道服务器是否收到(未处理)

标签: c# .net web-services model-view-controller iot


【解决方案1】:

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

直接沟通

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

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

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

排队通信

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

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

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

【讨论】:

  • 我正在考虑使用 mongoDB 作为队列,因为我们已经使用它来存储数据,但是服务必须每隔几秒访问一次以查看是否有新数据,这可能是矫枉过正。 MSMQ 或 SBWS 将是一个更好的选择,谢谢信息:)
  • SBWS 对我来说似乎也很有希望。它的丑陋之处在于它很容易混淆 Azure 服务总线 (ASB),因为资源似乎偶尔会混合。您可以使用MSDN 作为第一个起点。 This channel9 video by Clemens Vasters,在这个领域很有野心,也不错。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-03
  • 2010-09-12
  • 1970-01-01
  • 1970-01-01
  • 2010-10-19
  • 2017-10-21
相关资源
最近更新 更多