研究从服务器通知WPF客户端的解决方案

Ron*_*rby 16 .net wpf client-server server-push signalr

我有一个项目提出要求在服务器上发生某些事情时通知WPF桌面客户端.此外,WPF客户端的通知不会被广播(发送给每个客户端),应该发送给特定的客户端.

我想远离旧式服务器轮询.这需要尽可能接近实时.

我之前从未有过这个要求,而且我正在研究解决方案.我的第一个想法是将SignalR.NET客户端一起使用.我还没有使用过SignalR,但似乎它可能是一个解决方案.我知道这是对长轮询,服务器发送事件和WebSockets的抽象,具体取决于可用的内容.

我已经简要地阅读了有关回调和服务总线的WCF,但是对它们一无所知或这些技术是否适用于此.我可以使用之前解决过这个问题的人的一些反馈和建议.你会怎么做?

All*_*nek 7

使用WCF和双工合同可以非常轻松地完成此操作.您可以定义客户端可以在服务器上执行的操作(如任何Web服务),此外,您还可以定义服务器可以在客户端上执行的操作(即反向Web服务).代码方面,它们只是简单的方法调用.客户端具有调用服务器上的操作的方法,并且还必须提供实现回调契约的对象,该回调契约是服务器可以调用的接口,客户端必须提供实现.所有数据和消息的序列化/反序列化以及所有低级网络操作都由WCF处理,因此您不必担心它.

WCF使用两个绑定(或"协议")支持双工合同:

  1. WSDualHttpBinding - 这需要两个基于SOAP的HTTP侦听器,一个在服务器上,另一个在客户端上.当客户端想要联系服务器时,它会向服务器执行HTTP请求.当服务器想要联系客户端时,它会向客户端执行HTTP请求.这种方法的优点是任何网络连接都是短暂的,并且不会保持打开(与大多数HTTP连接一样),因此它可以支持大量或并发客户端.主要的缺点是它可能无法通过互联网与大多数客户端计算机一起使用,因为它们通常位于NAT后面(通过Internet进行服务器到服务器通信或内部网或LAN内的任何类型的通信都没有问题) .有关详细信息,请参阅我的其他答案.

  2. NetTcpBinding - 这基本上打开了从客户端到服务器的套接字,并在会话期间保持打开状态.这允许甚至通过NAT进行双向通信,但由于连接必须保持打开,这对服务器来说有点负担,因此能够支持较少的并发用户(但在大多数情况下可能仍然绰绰有余).这是我在WCF上进行双工合同的首选方式,因为它更容易上班并且更可靠.

WCF的优点是您可以在不更改代码的情况下在两个绑定之间切换.所需的只是更改配置(.config文件).

无论您选择哪种方式,您都可以在两个方向上执行近乎即时的通信(当然,网络延迟允许).当您拥有如此丰富,功能强大且易于使用的框架(如WCF)时,我不认为需要SignalR.如果你受到浏览器运行的限制,那么SignalR就有意义了.由于你在.NET中运行,它只会引入不必要的摩擦.


Hus*_*lil 0

这个问题很有趣。

我们目前正在开发一个与多个 Web 服务交互的应用程序。要求之一是每个客户端必须了解其他客户端所做的操作。

为了实现这一目标,我们正在考虑创建一个 Web 服务,其目的只是构建要通知的客户端列表,并处理通知对象、通知时间和通知内容背后的逻辑。客户端将在该服务启动时注册。正如您提到的,通知本身将使用回调来完成。

使用完全独立的 Web 服务的原因是我们所有现有的 Web 服务都需要在每次调用时建立和断开连接。使用通知 Web 服务,只要客户端运行,就必须保持连接。

很抱歉,我无法提供更多帮助,因为我们正在自己开发这样的系统。我也有兴趣获得有关此主题的反馈。