设计客户端/服务器应用程序以自动更新客户端软件

时间:2010-02-05 19:27:16

标签: .net client remoting

我正在使用.NET 2.0远程处理设计应用程序。它有一台服务器和多个客户端,可以随时上线或下线。

部分设计是服务器保存客户端安装程序MSI的副本。计划是,对于第一次安装,客户端将使用组策略进行部署,但每次安装客户端软件时,每次更新服务器副本时,都会自动从服务器更新。

要进行远程传输在技术上很容易,服务器使用File.ReadAllBytes将更新文件加载到byte []数组中,将其附加到远程对象,然后客户端使用File.WriteAllBytes保存它并使用Process。使用/ passive开始开始msi安装。

设计问题是应该从服务器推送更新还是从客户端提取更新。从服务器推送更快,但是留下了客户端可能处于脱机状态的缺点,并且可能需要在他们连接时在将来的某个随机点进行更新。从客户端拉取是可取的,因为它允许客户端在它们上线时自动更新。

有很多方法可以实现这一目标,所有这些方法都会引起与远程调用中使用的对象的版本控制问题,并且需要后续版本来保持升级接口的兼容性。

客户端拉文件的主要缺点是许多客户端可能会使服务器超载(要传输的msi文件是5mb,可能有200个客户端)虽然我可以编程客户端重试,直到成功,在服务器端似乎没有简单的方法来安排接收到的远程线程数量,因为一旦我加载了数据包并将控制返回到服务器端的远程接口,就没有简单的方法来确定实际传输数据的时间长度需要。我考虑了很多变通办法,包括在一段时间内按数字限制实际连接数,但这绝不会反映局域网的实际工作能力,但似乎仍然没有想法。我可以使用自定义通道接收器来控制线程数(我已经安装了一整套自定义接收器)但是希望尽可能避免这种情况,因为这必须是最后的手段。为简单起见,我宁愿将逻辑排除在通道接收器之外。

是否有任何知名的.NET应用程序为客户提供此类数据的自动更新,可随时上线或下线?

1 个答案:

答案 0 :(得分:3)

对于.NET中用于保持客户端软件版本最新的预构建解决方案,Visual Studio附带的ClickOnce可以提供相当可靠的工作。在应用程序启动时,应用程序将检查是否已将更新的版本上载到服务器。如果存在新版本,它将自动下载最新版本并安装。

对于一个相对简单的项目,ClickOnce通常运行良好,启动和运行起来非常简单。您将节省编写更新检查代码和传输代码的工作量,并且因为它将在IIS上运行,您对多个用户下载的担忧有所缓解(仍然可能耗尽您的带宽,但IIS可以正常使用大量的客户)。