一.緣起
之前已經寫了兩篇關於自動升級系統OAUS的設計與實現的文章(第一篇、第二篇),在為OAUS服務端增加自動檢測檔案變更的功能(這樣每次部署版本升級時,可以節省很多時間,而且可以避免手動修改帶來的錯誤)後,有部分使用者又提出了一個很好的建議:為OAUS增加斷點續傳功能。因為如果網路狀態不是很好,就經常會在升級到一半的時候,由於OAUS客戶端掉線而導致升級失敗,這個時候,就必須重新開始整個升級過程。即使升級中斷的時候,已經完成了99%,也必須重頭再來。所以,為OAUS增加斷點續傳功能是非常必要的。
現在,最新版本的OAUS已經增加了這個重要特性,當升級因為掉線而中斷的時候,OAUS客戶端並不會退出,而是一直嘗試斷線重連,重連成功後,就會從上次中斷的地方繼續升級。如下圖所示:
在網路狀態極差時,可能在一次升級的過程中,會出現多次斷線重連的情況,這都沒關係,OAUS客戶端會一直正常工作,直到整個升級過程完成為止。
二.原始碼實現
下面簡單說明一下程式碼實現的具體過程,OAUS斷點續傳功能是在客戶端實現的,服務端不需要做任何修改。
1.預定網路連線斷開的事件,得到掉線通知。此時,需要記錄是在升級第幾個檔案的時候,升級中斷的。
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增加斷點續傳功能時,就不需要再次實現與斷點續傳相關的繁瑣的業務邏輯了。
3. 如何使用OAUS升級機制的說明
一般而言,如果最新客戶端程式與老版本相容,不升級也影響不大,則可以交由使用者決定是否升級;如果最新客戶端程式不相容老版本,或者是有重大更新,則將啟動強制升級。如果流程要進入啟動升級,那麼只要啟動AutoUpdater的資料夾下AutoUpdater.exe就可以了。要注意的是,啟動AutoUpdater.exe程式後,要退出當前的客戶端程式,否則,有些檔案會因為無法被覆蓋而導致更新失敗。程式碼大致如下所示:
if (VersionHelper.HasNewVersion(oausServerIP,oausServerPort)) { string updateExePath = AppDomain.CurrentDomain.BaseDirectory + "AutoUpdater\\AutoUpdater.exe"; System.Diagnostics.Process myProcess = System.Diagnostics.Process.Start(updateExePath); ......//退出當前程式 }
三.相關下載
如果有任何建議或問題,請留言給我。