目的
很多做应用程序的朋友都做过为应用程序进行版本升级的功能,这个功能本身非常简单,但是各位有没有考虑过这个问题:假如我需要维护多个应用程序的时候(>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
欢迎交流 !!!