Linux Web 服务器和 .NET 客户端应用程序之间的实时通信

sit*_*ler 2 c# asp.net wpf wcf signalr

我正在尝试做什么

开发一个 C# WPF Windows 应用程序,该应用程序可以使用运行 CentOS 6 Linux 和 MySQL 的中央 Web 服务器向其他 WPF 应用程序发送和接收数据。

  • WPF 客户端必须能够向服务器发送消息,并且必须能够实时侦听服务器的消息并在消息发布后立即显示它们。

  • 服务器端程序应该能够将其中一些消息解析为 .NET 数据对象,并且应该能够向所有客户端或仅向特定客户端广播消息。

  • 如果客户端收到某个消息,它就会在本地应用程序上执行一个方法。
  • 每台客户端计算机都将在带有 .NET 4.5 或更高版本的 Windows 7,8 或 10 上运行,并将使用 Windows 防火墙,尽管有些客户端计算机可能具有其他第三方防火墙软件。

此外,如果服务器程序可以处理来自移动应用程序(Android 应用程序到服务器 - 服务器到 WPF 客户端,反之亦然)以及 WPF 客户端的请求,那将是非常可取的,但不是必需的。


例子

服务器(德克萨斯州服务器)

管理员客户端(加利福尼亚州用户)

客户端 2(佛罗里达州用户)

客户端3(纽约用户)

  1. 我从我的计算机(管理客户端)向服务器发送“hello”广播。

  2. 服务器接收消息并向所有侦听客户端广播“hello”。

  3. 客户端 2 和客户端 3 向其客户端显示“你好”并回复“嘿!”

  4. 服务器收到“嘿!” 消息并将两者发送到管理客户端。

  5. 我发送一条消息“芝麻开门”,该消息仅在客户端 2 的应用程序上执行 RunOnMagicWord() 方法,而对客户端 3 不执行任何操作。

  6. Client2 运行 RunOnMagicWord() 并发送“完成!” 方法执行后向服务器发送消息。

  7. 服务器收到“完成!” 消息并发送到管理客户端。


我调查过的内容

  • 休息/JSON
  • 周转基金服务
  • ASP.NET MVC
  • PHP 脚本
  • 信号R
  • 插座
  • Http客户端

我更愿意将所有内容保留在 C# .NET 中,包括服务器端程序,以便可以轻松序列化客户端之间发送到服务器的数据。SignalR 似乎最接近我正在寻找的东西,但在我看来它只适用于 IIS 而不是 Apache/Linux。我没有切换到 IIS 的选项,而且感觉我可能使整个事情过于复杂,所以......


我的问题

使用 SignalR 之类的东西,我是否走上了正确的道路?如果是这样,我如何让它在我的 CentOS 服务器上运行?或者是否有一种更简单的方法让 Linux/MySQL 服务器为 .NET 应用程序提供此类功能?


编辑:添加了我尝试过的其他内容,重新格式化了段落,添加了我对此项目的附加限制以响应评论

Hrv*_*udo 5

你提到的一切都可以工作。但是,您应该使用什么的决定可以由业务需求和约束来驱动:

  • signalr 和 websockets 不是可靠的传递机制。消息可能会丢失。将此用于客户端通知,如果消息未送达,风险较低
  • Web 服务(rest 或soap)是同步的,而且是点对点的。如果一方没有回应怎么办?带 Rest 的 WebApi 最容易实现,并且可以跨平台工作。让 PHP 与 .NET 对话很容易,只需记录并共享您的消息架构
  • RabbitMq、MSMQ、Azure 服务总线/队列等消息代理是异步且可靠的,但实现起来稍微复杂一些。您将获得适当的弹性和交付确认。

对于这种聊天功能,Linux 上的 SignalR 和 mono .net 应用程序应该可以正常工作。另外,Signalr 并不是唯一的选择,.net 有许多 websockets 实现,例如https://github.com/StackExchange/NetGain