ASP.NET 前端和 Windows 服务后端之间的通信?
Posted
技术标签:
【中文标题】ASP.NET 前端和 Windows 服务后端之间的通信?【英文标题】:Communication between ASP.NET frontend and Windows Service backend? 【发布时间】:2014-08-06 11:57:09 【问题描述】:我目前正在评估将 Web UI 添加到作为 Windows 服务安装和运行的 .NET 4.5 应用程序的选项。
基本思想是服务应用程序 24/7 全天候运行,并从网络设备收集各种数据并将它们持久保存在本地数据存储中(本质上,它监控这些设备)
Web UI 界面用于数据呈现和分析目的,并将命令和控制消息发送到后端(即服务层),后端将这些命令转发到网络设备。
与“经典”多层 Web 应用程序的最大区别在于,即使没有用户通过 Web UI 与之交互,服务部分也必须运行(因此我们的想法是将其作为 Windows 服务运行)。
我目前不知道如何将此 Web 部件(请求/响应模式,短时间运行)与服务部件(网络轮询,长时间运行,24/7)混合。
到目前为止我的想法:
将 IIS Core(或任何其他 Web 服务器)嵌入服务应用程序: 可能会工作,但嵌入式 Web 服务器不会知道同一台机器上的任何现有 IIS 配置,这会导致集成和配置不简单(例如端口、身份验证、SSL 等)
在 IIS 上部署一个 ASP.NET 应用程序和一个单独的服务应用程序:然后,ASP.NET 应用程序将充当服务的外观,并且需要一种适当且可靠的方式与服务应用程序通信(双向 IPC?)。
目前感觉好像 2 是最好的选择。
如果有,是否有任何 IPC 建议?
谢谢!
【问题讨论】:
我认为您的问题将被关闭,因为它是基于意见的。但是,是的,选项#2 是最常用的。从 vNext 开始,您将能够在 Windows 服务中自托管 ASP.NET MVC 应用程序(通过 OWIN),因此 Web UI 可以直接位于服务本身中。 @Aristos:他需要轮询一些网络设备(很可能是重复),这使得仅 IIS 的应用程序(即网络应用程序)不太适合。 @MarcelN。对了,服务部分其实是整个软件系统的核心部分,web ui 是查看数据的一种方式 第二个选项不错。您将拥有独立且松散耦合的层。如果网站和windows服务之间的通信不是实时的,那就不要使用IPC,它会增加复杂性。当网站编写命令并且 Windows 服务读取它们并进行处理时,只需考虑一个数据库/表。一旦命令被处理,windows服务就可以删除它们。 【参考方案1】:最简单(也可能是最糟糕)的方法是将所有逻辑嵌入到 IIS 中并禁用关闭应用程序(这样 IIS 应用程序将像 Windows 服务一样运行)。
我目前不知道如何将此 Web 部件(请求/响应模式,短时间运行)与服务部件(网络轮询,长时间运行,24/7)混合。
你不应该。关于第二种情况,我建议尽可能将您的服务应用程序和 web ui 应用程序解耦。这样可以最大限度地减少依赖性和 IPC(从而提高可扩展性和稳定性)。
在这种情况下,Windows 服务可以实现其最小角色:collecting various data from network devices and persists them in a local data store
(唯一需要 24/7 的功能)。 IIS 应用程序可以实现所有与 UI 相关的功能(数据呈现和分析角色)和用户命令。这样,您无需将所有演示功能委托给 Windows 服务应用程序。 IPC 仅用于sending command & control messages to the backend (i.e. the service layer) which in turn fowards these commands to the network devices
。
我建议使用异步 IPC 的消息队列模型(ZeroMQ、MSMQ、RabbitMQ 等),具有其优势。另一方面,可以将数据库本身用于 IPC:例如将消息推送到某个表(如果使用 NoSQL,则为集合)并由 win 服务应用程序读取它们。这是消息队列的替代方案,但在大多数情况下比它更糟糕。
【讨论】:
谢谢。我认为“混合”是错误的术语——我当然不想混合这两个部分,而是让它们以可靠的方式相互通信。以上是关于ASP.NET 前端和 Windows 服务后端之间的通信?的主要内容,如果未能解决你的问题,请参考以下文章
在 javascript/typescript 前端和 ASP.net Core 5 后端之间传递日期对象的正确方法
使用 ASP.NET Core 后端和 React 前端的 Web 应用程序中的授权和身份验证?