想象一下WinForms客户端应用程序,它通过HTTPChannel显示从服务器应用程序获取的相当复杂的计算数据.Net Remoting。
由于客户端应用程序可能正在运行整个工作日,因此我需要一种方法来通知客户端新数据可用,以便用户能够在需要时重新加载数据。
目前我正在使用远程.Net事件,将事件序列化到客户端,然后在客户端重新抛出事件。
我对此设置不满意并计划重新实施。
对我来说重要的是:
当限于.Net 2.0时,您将如何实现此功能?你会使用哪些技术/库?
我正在寻找如何解决问题的灵感。
编辑:
客户端和服务器存在于同一组织中,通常是LAN,可能是WAN / VPN情况 此机制应仅使客户端知道有新数据可用。我想继续远程将实际数据发送给客户端,因为它运行良好。 MSMQ自带windows,不是吗?所以应该可以使用它,但我愿意接受任何替代方案。
答案 0 :(得分:1)
我使用MSMQ实现了类似的通知机制。客户端计算机打开本地公共队列,然后向服务器通知其队列名称。发生更改时,服务器会将通知推送到所有可以识别的客户端队列中。通过这种方式,客户端将知道数据已就绪,即使在发送通知时它没有运行。
唯一的缺点是它需要客户端上的MSMQ,所以如果你没有对客户端机器的那种控制,这可能不起作用。
对于额外级别的冗余(例如,如果客户端计算机完全关闭,因此客户端队列不可用),您可以在传播到客户端之前在服务器上排队通知。服务器队列中的通知仅在成功联系客户端时(或者可能在3次尝试失败后等)中删除。
同样在这方面,如果服务器无法在一段测量的时间内向客户端发送测量次数的消息,则通知支持实体,发出错误警报,并从客户端队列中删除客户端队列目的地列表。当我说“测量”时,我指的是对设置有意义的频率/持续时间。在我的情况下,它是5次重试,尝试间隔5分钟。
让客户端每隔一段时间“更新”它的通知订阅也是有意义的。如果未发生续订,则最终通过服务中的“groomer”进程从目标列表中删除客户端队列。
答案 1 :(得分:0)
听起来好像需要实现基于消息队列的解决方案。易于实施,可以在重新启动后继续存在,并且该技术在服务器(MSMQ,MGQSeries)和客户端(System.Messaging)上都很成熟
答案 2 :(得分:0)
如果您无法找到任何内置内容并假设您知道所有客户端的地址,则可以在数据更改时向他们发送UDP消息。使用UdpClient,这非常简单。如果客户端应用程序可以假定某个端口上的任何UDP数据意味着它需要从服务器获取新数据,则数据报甚至不需要包含任何数据。
如果有必要,您甚至可以将其作为广播数据包(如果您不知道客户端是谁以及它们与服务器位于同一子网上),只要服务器不是“太健谈”。
无论您决定采用何种解决方案,我都会敦促您避免让客户进行投票。这将产生大量不必要的网络流量,但仍然无法完成所有这些。
答案 3 :(得分:-1)
我通常会在客户端上使用UI计时器定期点击服务器以查看是否有新的或更新的数据。 (假设您有一种机制来识别您有新数据,如新行的时间戳,或文件时间戳,或具有最后计算日期的表等)
这样服务器就不必知道客户端了。客户可以在闲暇时等进行检查。