0

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

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

  • 基于 .Net 2.0 的技术
  • 易于使用
  • 低复杂度
  • 足够强大,可以在服务器或客户端重新启动后仍然有效

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

编辑:

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

4

4 回答 4

1

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

唯一的缺点是它需要客户端上的 MSMQ,因此如果您对客户端的机器没有这种控制权,这可能不起作用。

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

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

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

于 2008-10-14T14:23:49.440 回答
0

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

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

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

于 2008-10-14T21:31:52.587 回答
0

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

于 2008-10-14T14:21:42.813 回答
-1

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

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

于 2008-10-14T14:26:17.220 回答