以前已经写了两篇关于自动升级系统OAUS的设计与实现的文章(第一篇、第二篇),在为OAUS服务端增长自动检测文件变动的功能(这样每次部署版本升级时,能够节省不少时间,并且能够避免手动修改带来的错误)后,有部分使用者又提出了一个很好的建议:为OAUS增长断点续传功能。由于若是网络状态不是很好,就常常会在升级到一半的时候,因为OAUS客户端掉线而致使升级失败,这个时候,就必须从新开始整个升级过程。即便升级中断的时候,已经完成了99%,也必须重头再来。因此,为OAUS增长断点续传功能是很是必要的。html
如今,最新版本的OAUS已经增长了这个重要特性,当升级由于掉线而中断的时候,OAUS客户端并不会退出,而是一直尝试断线重连,重连成功后,就会从上次中断的地方继续升级。以下图所示: api
在网络状态极差时,可能在一次升级的过程当中,会出现屡次断线重连的状况,这都不要紧,OAUS客户端会一直正常工做,直到整个升级过程完成为止。 网络
下面简单说明一下代码实现的具体过程,OAUS断点续传功能是在客户端实现的,服务端不须要作任何修改。this
1.预约网络链接断开的事件,获得掉线通知。此时,须要记录是在升级第几个文件的时候,升级中断的。spa
2.预约重连成功时间,获得网络连接恢复的通知。此时,开始从新下载下一个须要升级的文件。设计
void rapidPassiveEngine_RelogonCompleted(LogonResponse res) { if (res.LogonResult == LogonResult.Succeed) { this.DownloadNextFile(); this.logger.LogWithTime("重连成功,开始续传!"); if (this.UpdateContinued != null) { this.UpdateContinued(); } return; } }
private void DownloadNextFile() { if (this.haveUpgradeCount >= this.fileCount) { return; } DownloadFileContract downLoadFileContract = new DownloadFileContract(); downLoadFileContract.FileName = this.downLoadFileRelativeList[this.haveUpgradeCount]; //请求下载下一个文件 this.rapidPassiveEngine.CustomizeOutter.Send(InformationTypes.DownloadFiles, CompactPropertySerializer.Default.Serialize(downLoadFileContract)); }
加上以上的逻辑处理以后,OAUS就已经具有了断点续传的功能了。代码看起来很是简单,那是由于内部核心的文件传送功能、断点续传功能都由ESFramework封装好了。在为OAUS增长断点续传功能时,就不须要再次实现与断点续传相关的繁琐的业务逻辑了。code
3. 如何使用OAUS升级机制的说明orm
通常而言,若是最新客户端程序与老版本兼容,不升级也影响不大,则能够交由用户决定是否升级;若是最新客户端程序不兼容老版本,或者是有重大更新,则将启动强制升级。若是流程要进入启动升级,那么只要启动AutoUpdater的文件夹下AutoUpdater.exe就能够了。要注意的是,启动AutoUpdater.exe进程后,要退出当前的客户端进程,不然,有些文件会由于没法被覆盖而致使更新失败。代码大体以下所示: htm
if (VersionHelper.HasNewVersion(oausServerIP,oausServerPort)) { string updateExePath = AppDomain.CurrentDomain.BaseDirectory + "AutoUpdater\\AutoUpdater.exe"; System.Diagnostics.Process myProcess = System.Diagnostics.Process.Start(updateExePath); ......//退出当前进程 }
1.自动升级系统OAUS - 源码blog
若是有任何建议或问题,请留言给我。