【问题标题】:How would you notifiy clients about changed data on the server using .Net 2.0?您将如何使用 .Net 2.0 通知客户端有关服务器上更改数据的信息?
【发布时间】:2026-02-05 00:30:01
【问题描述】:

想象一个 WinForms 客户端应用程序,它显示相当复杂的计算数据,该数据是通过 HTTPChannel 使用 .Net Remoting 从服务器应用程序获取的。
由于客户端应用程序可能会运行一整天,因此我需要一种方法来通知客户端新数据可用,以便用户能够在需要时重新加载数据。
目前我正在使用远程 .Net 事件,将事件序列化到客户端,然后在客户端重新抛出事件。

我对这个设置不太满意,并计划重新实现它。
对我来说重要的是:

  • .Net 2.0 技术
  • 易于使用
  • 低复杂度
  • 足够强大,可以在服务器或客户端重启后仍然正常运行

当仅限于 .Net 2.0 时,您将如何实现这样的功能?您会使用哪些技术/库?
我正在寻找如何解决这个问题的灵感。

编辑:

客户端和服务器存在于同一个组织中,通常是 LAN,也可能是 WAN/VPN。
这种机制应该只让客户端知道有新数据可用。我想继续远程处理以将实际数据发送给客户端,因为它运行良好。 MSMQ 带有 windows,不是吗?所以使用它应该没问题,但我愿意接受任何替代方案。

【问题讨论】:

  • 客户是您组织内部的还是外部的?你对环境有一些控制吗? MSMQ?您要传输多少数据?
  • MSMQ 在这种情况下是理想的。它可以安装在服务器或客户端上,无需重新启动。此外,如果 AD 可用,您还有更多用于队列查找、发现等的选项。

标签: c# .net events remoting client-server


【解决方案1】:

我已经使用 MSMQ 实现了类似的通知机制。客户端机器打开一个本地的公共队列,然后将它的队列名称通知服务器。当发生更改时,服务器会将通知推送到它知道的所有客户端队列中。这样客户端就会知道数据已经准备好了,即使在发送通知时它没有运行。

唯一的缺点是它需要在客户端上使用 MSMQ,因此如果您对客户端的计算机没有这种控制权,这可能无法正常工作。

对于额外的冗余级别(例如,如果客户端计算机完全停机,因此客户端队列不可用),您可以在将通知发布到客户端之前在服务器上排队。服务器队列中的通知仅在成功联系到客户端(或者可能在 3 次尝试失败后等)时才会被删除

同样在这方面,如果服务器在一定时间段内未能将消息传递给客户端一定次数,那么会通知支持实体,发出错误警报,并将客户端队列从目的地列表。当我说“测量”时,我的意思是对设置有意义的频率/持续时间。在我的例子中,它是 5 次重试,尝试之间的间隔为 5 分钟。

让客户端每隔一段时间“更新”它的通知订阅也可能有意义。如果没有发生续订,则最终客户端队列会被服务中的“groomer”进程从目标列表中删除。

【讨论】:

  • 谢谢,我会调查的。如果客户端将他们的队列发布到服务器,如果客户端在没有通知服务器的情况下离线,服务器上是否会有丢失队列引用的机会?
【解决方案2】:

听起来好像您需要实现基于消息队列的解决方案。易于实施,可以在重启后存活,并且该技术在服务器(MSMQ、MGQSeries)和客户端(System.Messaging)上都很成熟

【讨论】:

    【解决方案3】:

    如果您找不到任何内置内容,并且假设您知道所有客户端的地址,则可以在数据更改时向它们发送 UDP 消息。使用 UdpClient,这很容易。如果客户端应用程序可以假设某个端口上的任何 UDP 数据意味着它需要从服务器获取新数据,则数据报甚至不需要包含任何数据。

    如有必要,您甚至可以将其设为广播数据包(如果您不知道客户端是谁并且它们与服务器位于同一子网中),只要服务器不太“健谈”即可。

    无论您决定采用何种解决方案,我都敦促您避免让客户进行投票。这将产生大量不必要的网络流量,并且仍然不会表现得那么好。

    【讨论】:

      【解决方案4】:

      我通常会在客户端使用 UI 计时器来定期访问服务器以查看是否有新的或更新的数据。 (假设您有一种机制来识别您有新数据,例如新行的时间戳、文件时间戳或带有最后计算日期的表格等)

      这样服务器就不必知道客户端。客户可以在闲暇时查看等。

      【讨论】:

      • 我得到-1?这与 tamberg 上行线程的想法基本相同。客户端应该轮询新数据。让服务器联系客户端不是很健壮。无状态服务器对此更好。给我最后一次更新的日期。给我数据。你编写这两个代码就可以了。
      最近更新 更多