目的
很多做應用程序的朋友都做過為應用程序進行版本升級的功能,這個功能本身非常簡單,但是各位有沒有考慮過這個問題:假如我需要維護多個應用程序的時候(>2)。每個應用程序的升級工作將變得很繁瑣。我們需要有一套通用的更新機制,只需要為需要升級的應用程序進行簡單的配置,就可以為之進行版本升級控制,而不需要單獨給每個應用程序寫升級的功能從而達到一勞永逸的目的。
組成
那么通用更新的組件應該如何來設計,它至少需要以下兩個模塊構成:
1.客戶端模塊
1.1 負責發送版本驗證請求
1.2 負責下載程序所需的更新文件(如果需要更新)
2.服務端模塊
2.1 負責新增/維護被授權的應用程序基礎信息
2.2 負責發布應用程序新版本信息及文件
2.3 負責驗證應用程序版本,並返回驗證結果(如果需要更新則返回服務器地址,文件路徑等等數據,以xml/json形式都可以)
開始構造
首先是服務端的創建,服務端是一個web應用程序。首先創建它的數據庫
1.數據庫表設計
1.1 應用程序基礎信息表(EP_Update_Program)
| 字段名 | 說明 | 字段類型 |
| Id | 自增長序列號 | bigint |
| ProgramCode | 應用程序唯一標識碼 | varchar(50) |
| ProgramName | 應用程序名稱 | varchar(50) |
| FtpAddress | FTP服務器路徑 | varchar(50) |
| FtpUserName | FTP服務器用戶名 | varchar(50) |
| FtpPassword | FTP服務器密碼 | varchar(50) |
| FtpPort | FTP服務器端口 | varchar(50) |
1.2 應用程序版本信息表(EP_Update_Version)
| 字段名 | 說明 | 字段類型 |
| Id | 自增長序列號 | bigint |
| ProgramCode | 應用程序唯一標識碼 | varchar(50) |
| ProgramVersion | 應用程序版本自定義標識碼 | varchar(50) |
| UpdateContent | 本次版本更新內容 | varchar(500) |
| UpdateTime | 版本更新時間 | datetime |
| Publisher | 版本發布人 | varchar(50) |
1.3 應用程序更新文件路徑表(EP_Update_FilePath)
| 字段名 | 說明 | 字段類型 |
| Id | 自增長序列號 | bigint |
| VersionId | 應用程序版本編號 | varchar(50) |
| FilePath | 服務器文件路徑(FTP根目錄開始) | varchar(100) |
| SavePath | 本地文件保存路徑(應用程序根目錄開始) | varchar(100) |
2.注意事項
如上,一個簡陋的服務端數據庫表就設計好了,它能滿足最基本的管理/控制/發布應用程序版本信息及文件的數據管理需求(如有其它需求可對數據表自行擴展)。值得我們注意的細節就是應用程序跨版本升級。什么是跨版本升級???
應用程序本地版本為v1.0, 服務器上該程序的最新版本為v1.2 (假設版本跨度步長為0.1)。那么本地與服務器的版本就相差了兩個版本(v1.1和v1.2),這個時候應用程序發送版本驗證請求,服務端應該同時返回v1.1和v1.2兩個版本的文件,並且要過濾掉版本重復的文件,重復的文件以最新版本為准。
舉個例子:
v1.1 更新的文件為 a.exe | b.dll | c.xml
v1.2 更新的文件為 a.exe | c.dll | c.xml
服務端返回結果應該為:
v1.1 的 b.dll
v1.2 的 a.exe | c.dll | c.xml (a.exe和c.xml與v1.1版本中的文件重復,所以要過濾之,以最新版本的文件為准)
SQL主要實現代碼:
select ver.ProgramVersion,ff.FilePath,ff.SavePath from EP_Update_FilePath as ff inner join EP_Update_Version on ff.VersionId=ver.Id where exists(select max(f.Id) as VersionId from EP_Update_Program as p
inner join EP_Update_Version as v on p.ProgramCode=v.Progra,Code and v.Id > @VersionId
inner join EP_Update_FilePath as f on f.VersionId=v.Id where p.ProgramCode=@ProgramCode
group by f.FilePath having ff.Id=max(f.Id))
上述SQL查詢出了該應用程序本次升級所需要的文件列表。在服務端中以xml/json的方式進行組織並返回給應用程序。
服務端運行效果圖
其余添加應用程序基礎信息,發布版本等基礎性操作數據庫的代碼我就不貼了,直接上效果圖:





服務端的創建工作完成了,接下來是客戶端的創建
首先客戶端在本地具有自己的版本配置文件:
1 <?xml version="1.0" encoding="utf-8" ?> 2 <configuration> 3 <appSettings> 4 <add key="Program_Code" value="應用程序唯一標識碼" /> 5 <add key="Program_Title" value="應用程序名稱" /> 6 <add key="Program_InvokeName" value="主程序exe名稱" /> 7 <add key="Program_LocalVersion" value="本地版本" /> 8 </appSettings> 9 </configuration>
通用更新組件的客戶端應該被設置為啟動程序。由更新組件客戶端來調用主程序而不是直接打開主程序。把它放在與主程序同級的文件目錄,並配置主程序的exe名稱。

啟動的時候調用web服務,傳入自己的程序唯一標識碼和本地版本,由服務器返回xml/json數據並解析之,根據結果來決定是否需要下載文件或者直接啟動
客戶端運行效果圖:
同樣的調用web服務和下載文件的基礎性代碼我就不貼出來了,直接附上效果圖:



到這里,通用更新組件的服務端與客戶端就搭建好了。只需要做一下簡單的配置,就能為應用程序提供版本升級服務,極大的方便簡化了程序員做版本升級的工作。
QQ 3045568793 山雞 WPF技術交流群 372754241
歡迎交流 !!!
