我是靠谱客的博主 欢呼黄蜂,这篇文章主要介绍c/s 自动升级(WebService),现在分享给大家,希望可以做个参考。

转自:c/s 自动升级(WebService) - jio92 - 博客园 http://www.cnblogs.com/jio92/p/AutoUpdater.html

做c/s开发肯定会遇到的就是自动升级功能,而这实现方式是非常多. 本文使用 webservice的方式来提供升级服务

  


 首先准备服务

为了方便我们专门用一个文件夹来存放需要更新的应用程序

因为觉得通过新版本来更新很麻烦,所以验证文件是否需要更新用md5来判断

WebService:

复制代码
复制代码
1
2
3
4
5
6
7
8
9
10
11
public string GetVer() { DirectoryInfo dir = new DirectoryInfo(Server.MapPath("update")); var list = new List<object>(); var url = string.Format("http://{0}:{1}/update/", HttpContext.Current.Request.Url.Host, HttpContext.Current.Request.Url.Port); DirectoryInfoHelper.SetDirectoryInfo(dir, list, url, ""); JavaScriptSerializer json = new JavaScriptSerializer(); return json.Serialize(list); }
复制代码

相关方法:

复制代码
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
public static void SetDirectoryInfo(DirectoryInfo dir, List<object> list, string url, string dirName) { foreach (var file in dir.GetFiles()) { FileStream fs = File.OpenRead(file.FullName); list.Add(new { file.Name, Md5 = Security.GetMd5(fs), LocalHost = url, Directory = dirName }); fs.Close(); } foreach (var dirInfo in dir.GetDirectories()) { SetDirectoryInfo(dirInfo, list, url, string.Format("{0}{1}/", dirName, dirInfo.Name)); } }
复制代码

说明:1.不创建模型,而服务端只需要提供数据,所以采用匿名对象

       2.GetVer服务返回信息中 包含 文件名,md5值,域名地址,该文件上级目录


C/S:

先看界面

现在就跟着提示消息走吧.

1.获取服务文件特征

调用webservice获取文件信息

复制代码
复制代码
1
2
3
4
5
6
7
private List<VerMd5Date> GetServerData() { AutoUpdate.Update update = new AutoUpdate.Update(); var json = update.GetVer(); var list = AppCode.JsonHelper.JsonDeserialize<VerMd5Dates>(json); return list; }
复制代码

客户端需要反序列化json 所以建了一个对应model

复制代码
复制代码
1
2
3
4
5
6
7
8
9
10
public class VerMd5Date { public string Name { get; set; } public string Md5 { get; set; } public string LocalHost { get; set; } public string Directory { get; set; } } class VerMd5Dates : List<VerMd5Date> { }
复制代码

反序列化:

复制代码
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
/// <summary> /// 反序列化json /// </summary> /// <typeparam name="T">对象</typeparam> /// <param name="jsonString">json字符串</param> public static T JsonDeserialize<T>(string jsonString) { DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T)); MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString)); T obj = (T)ser.ReadObject(ms); return obj; }
复制代码

 

2.获取本地文件特征

复制代码
复制代码
1
2
3
4
5
6
7
private List<VerMd5Date> GetLocalData(List<string> serverNames) { DirectoryInfo dir = new DirectoryInfo(Application.StartupPath); var list = new List<VerMd5Date>(); DirectoryInfoHelper.GetDirectoryInfo(dir, list,"",serverNames); return list; }
复制代码

相关方法:

复制代码
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public static void GetDirectoryInfo(DirectoryInfo dir, List<VerMd5Date> list, string dirName, List<string> serverNames) { foreach (var file in dir.GetFiles().Where(m=>serverNames.Contains(dirName+m.Name))) { using (FileStream fs = File.OpenRead(file.FullName)) { list.Add(new VerMd5Date { Name = file.Name, Directory = dirName, Md5 = Security.GetMd5(fs) }); } } foreach (var dirInfo in dir.GetDirectories()) { GetDirectoryInfo(dirInfo, list, string.Format("{0}{1}/", dirName, dirInfo.Name), serverNames); } }
复制代码

说明:serverNames 是服务器文件名集合,主要用来排除本地文件夹中非本程序文件

3.对比文件差异

复制代码
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
private List<VerMd5Date> EqualsList(List<VerMd5Date> list, List<VerMd5Date> localList) { var getList = new List<VerMd5Date>(); foreach (var ver in list) { var file = localList.FirstOrDefault(m => m.Name == ver.Name && m.Directory == ver.Directory); if (file == null) { getList.Add(ver); } else { if (file.Md5 != ver.Md5 && file.Directory == ver.Directory) { getList.Add(ver); } } } return getList; }
复制代码

4.下面就开始下载吧

复制代码
1
2
3
4
5
foreach (var file in _getList) { SetItem(string.Format("正在下载 {0}{1}", file.Directory, file.Name)); DownloadFile(file.LocalHost, file.Directory, file.Name, progressBar1); }
复制代码
1
DownloadFile:
  View Code

下载方式有很多,这里已经有了文件的下载地址,下载代码大家就尽情发挥.有什么好的方式也告诉我一下,非常感谢

 

运行截图

基本上就完了.欢迎高手吐槽.

很多朋友说dll文件无法下载,本人测试时没问题的.

还有其他特殊文件如cs,config.这里提供2中解决方案

1.先压缩,下载完后解压

2.改后缀,什么后缀随意,只要排除特殊不能下载的后缀

 源码地址:http://download.csdn.net/detail/fenglove123/6031397

最后

以上就是欢呼黄蜂最近收集整理的关于c/s 自动升级(WebService)的全部内容,更多相关c/s内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(84)

评论列表共有 0 条评论

立即
投稿
返回
顶部