首先声明,本人文笔不好,大家见笑,请高手不要吐槽.

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


首先准备服务

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

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

WebService:

 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);}

相关方法:

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获取文件信息

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

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>{}

反序列化:

 /// <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.获取本地文件特征

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;}

相关方法:

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.对比文件差异

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.下面就开始下载吧

foreach (var file in _getList){SetItem(string.Format("正在下载 {0}{1}", file.Directory, file.Name));DownloadFile(file.LocalHost, file.Directory, file.Name, progressBar1);}

DownloadFile:
View Code

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

运行截图

基本上就完了.请高手不要吐槽啊.

源码地址:http://pan.baidu.com/share/link?shareid=656896785&uk=2215622930

c/s 自动升级(WebService)相关推荐

  1. c/s 自动升级(WebService)

    首先声明,本人文笔不好,大家见笑,欢迎高手吐槽. 做c/s开发肯定会遇到的就是自动升级功能,而这实现方式是非常多. 本文使用 webservice的方式来提供升级服务 首先准备服务 为了方便我们专门用 ...

  2. CAutoupdater通用自动升级组件

     CAutoupdater通用自动升级组件 1.CAutoupdater通用自动升级组件介绍 1.1.组件介绍 C/S构的特点是能充分发挥客户端的处理能力,很多工作可以由客户端处理后再提交给服务器,对 ...

  3. 自动升级的原理及实现

        C/S程序自动升级是一个很重要的功能,原理其实很简单,一般包含两个程序一个是主程序,也就是除了升级功能以外的程序,另一个就是升级程序,常见的360,金山安全卫士都是这样.  主要包括以下几点: ...

  4. 【转载】插件自动升级

    ESFramework介绍之(20)―― 插件自动升级 当我们的服务平台搭建成功后,所需要做的主要事情就是开发服务端功能插件(IFunAddin)和客户端插件(IPassiveAddin),每个插件对 ...

  5. 在WinForm中使用Web Services 来实现软件自动升级(转)

    一.升级的好处. 长期以来,广大程序员为到底是使用Client/Server,还是使用Browser/Server结构争论不休,在这些争论当中,C/S结构的程序的可维护性差,布置困难,升级不方便,维护 ...

  6. tomcat升级_「shell脚本」懒人运维之自动升级tomcat应用(war包)

    准备: 提前修改war包里的相关配置,并上传到服务器: 根据要自动升级的tomcat应用修改或添加脚本相关内容: tomcat启动脚本如是自己写的,要统一格式命名,如:xxx.xxxTomcat 等: ...

  7. 软件自动升级ftp服务器,国人自己的专业FTP服务器软件(上)

    目前FTP服务器软件都为国外作品,国内成熟的FTP服务器软件很少,有一些,但从功能上看来远不能和那些流行的服务器软件媲美.不过,笔者近日发现了一款国人自行开发的FTP服务器软件Crob FTP Ser ...

  8. Ionic实战 自动升级APP(Android版)

    Ionic 框架介绍 Ionic是一个基于Angularjs.可以使用HTML5构建混合移动应用的用户界面框架,它自称为是"本地与HTML5的结合".该框架提供了很多基本的移动用户 ...

  9. VS 打包升成可自动升级的安装包

    VS 打包升成可自动升级的安装包 http://www.sufeinet.com/forum.php?mod=viewthread&tid=2187 posted on 2013-07-23 ...

最新文章

  1. 域用户权限设置目录权限
  2. mongodb 安装_1、MongoDB 安装
  3. Tomcat7配置DataSource数据源
  4. Windows远程桌面管理--功能强大的远程批量管理工具
  5. iis 不是 php,iis是不是默认支持php
  6. 开源数学软件zzllrr Mather小乐数学简介Summary
  7. java mina unix client
  8. 缔造完美运维 共谱双赢新篇
  9. PyTorch 系列 | 数据加载和预处理教程
  10. python不合法的布尔表达式_python测试题
  11. eclipse各个版本的区别
  12. CCF201712试题
  13. php重写mysql类_如何成功重写旧的mysql-php代码与已弃用的mysql_ *函数?
  14. 适用于ActiveX v18.6 x86的Codejock Xtreme Suite Pro
  15. 【雷达信号处理基础】第1讲 -- 雷达系统概述
  16. 【工具篇】OBS推流在Bilibli直播平台的设置和应用
  17. redis-CacheCloud
  18. 联想台式机进入修复计算机,联想台式机一键恢复的使用方法
  19. 使用ffmpeg对视频、图片进行旋转,上下翻转,水平翻转
  20. java去处科学技术法,java撤销科学计数法

热门文章

  1. C++Slow Sort慢排序的实现算法(附完整源码)
  2. C语言实现克拉茨Collatz序列(附完整源码)
  3. C语言实现聚类K-means cluster算法(附完整源码)
  4. C++普通引用和常引用
  5. 18_clickhouse副本同步与高可用功能验证,分布式表与集群配置,数据副本与复制表,ZooKeeper整合,创建复制表,副本同步机制,数据原子写入与去重,负载平衡策略,案例(学习笔记)
  6. HDP安全之集成kerberos/LDAP、ranger;安装部署kerberos;安装Knox;安装LDAP;启动LDAP;验证Knox网关
  7. 用模板元实现50个台阶问题,一次走一步或者两步或者3步,用模板元实现求裴波那契额数列
  8. java调用WCF问题
  9. LINUX系统中动态链接库的创建与使用
  10. 笔画输入法电脑版_太有才!浙江路政员发明汉字码输入法