[---  资料是从免费网站上获取的,上载在这里,只为交流学习目的,文章原作者保留所有权力,
如本博客的内容侵犯了你的权益,请与以下地址联系,本人获知后,马上删除。同时本人深表歉意,并致以崇高的谢意!
erwin_609@msn.com  ---]

利用Web Services实现软件自动升级

作者: 曹庆旭

摘  要:软件维护升级工作是软件生命周期最重要的环节。为了解决以往C/S(Client/Server)模式下的客户端软件升级效率低的问题,设计了C/S应用系统自动升级处理程序。该程序利用Web Services技术、C#和XML语言,通过网络来完成C/ S应用系统的自动升级。与原有手工升级、FTP 文件服务器升级和第三方控件升级相比,升级效率更高。该方案具有较好的参考价值。
关键词:C#;Web Services;XML;软件自动升级

1 引言
随着计算机网络应用技术的不断发展,在开发MIS系统时,大多采用基于C/S(客户机/服务器)模式或B/S(浏览器/服务器)模式。现在B/S模式以其真正意义上的瘦客户机/胖服务器模式优势占据了主导地位。但是由于客户机/服务器模式具有的数据流量小、响应时间短、安全性高等特点,在解决几十个到几百个用户的局域网中,仍然是一个不错的选择[1-3]。在C/S模式下,应用程序的每次升级都需要在每个客户端重新安装应用程序,这是一项十分繁琐的事情。面对这个实际问题,这里设计了一个通过软件实现自动升级技术方案,弥补了这一缺陷,有较好的参考价值。
2 设计思路
判断一个文件是否要更新,可以通过判断文件的大小、修改日期和文件的版本号来实现[3-5]。发现最新的则提示用户是否升级。
在Web Services中实现一个GetVer的WebMethod方法,其作用是获取当前的最新版本。然后将现在版本与最新版本比较,如果有新版本,则进行升级。
3 自动升级的技术实现
(1)编写升级模板文件Update.xml
准备一个XML文件 (Update.xml) ,作为一个升级用的模板。
……
 <description>升级记录</description>
   <filelist count="4" sourcepath="./update/">
……
    <item name="CustomerApplication.exe" size="">
     <value />
    </item>
    <item name="Interop.SHDocVw.dll" size="">
     <value />
    </item>
……
SHDocVw.DLL 是Internet Explorer的一个组件,该组件负责控制对从Web 站点返回的URL和信息的处理。
(2)编写Web Services的GetVer方法
GetVer方法用于取得软件的更新版本。
              [WebMethod(Description="取得更新版本")]
              Public string GetVer()
              {
                     XmlDocument doc = new XmlDocument();
                     doc.Load(Server.MapPath("update.xml"));
                     XmlElement root = doc.DocumentElement;
                     return root.SelectSingleNode("version").Inertest;
              }
(3)编写Web Services的GetUpdateData方法
GetUpdateData方法用于在线更新软件。
              [WebMethod(Description="在线更新软件")]
              [SoapHeader("sHeader")]
              public System.Xml.XmlDocument GetUpdateData()
              {
                     //验证用户是否登陆
                     if(sHeader==null)
                            return null;
                     if(!DataProvider.GetInstance.CheckLogin(sHeader.Username,sHeader.Password))
                            return null;
                     //取得更新的xml模板内容
                     XmlDocument doc = new XmlDocument();
                     doc.Load(Server.MapPath("update.xml"));
                     XmlElement root = doc.DocumentElement;
                     //看看有几个文件需要更新
                     XmlNode updateNode = root.SelectSingleNode("filelist"); 
                     string path = updateNode.Attributes["sourcepath"].Value;
                     int count = int.Parse(updateNode.Attributes["count"].Value);
                     //将xml中的value用实际内容替换
                     for(int i=0;i= updateNode.ChildNodes[i];
                            string fileName = path + itemNode.Attributes["name"].Value;
                            FileStream fs = File.OpenRead(Server.MapPath(fileName));
                            itemNode.Attributes["size"].Value = fs.Length.ToString();
                            BinaryReader br = new BinaryReader(fs);
                            //这里是文件的实际内容,使用了Base64String编码
                            itemNode.SelectSingleNode("value").InnerText = Convert.ToBase64String(br.ReadBytes((int)fs.Length),0,(int)fs.Length);
                            br.Close();
                            fs.Close();
                     }
                     return doc;
              }

(4)编写客户端的UpDate方法
  首先引用此Web Services,例如命名为:WebSvs,
string nVer = Start.GetService.GetVer(); 
if(Application.ProductVersion.CompareTo(nVer)<=0)
update();
  在本代码中Start.GetService是WebSvs的一个静态实例。功能是:首先检查版本,将结果与当前版本进行比较,如果为新版本则执行UpDate方法。
update的作用是将升级的XML文件下载下来,保存为执行文件目录下的一个Update.xml文件。任务完成,退出程序,等待Update.Exe 来进行升级。
void update()
       {
              this.statusBarPanel1.Text = "正在下载...";
              System.Xml.XmlDocument doc = ((System.Xml.XmlDocument)Start.GetService.GetUpdateData());
              doc.Save(Application.StartupPath + @"\update.xml");
              System.Diagnostics.Process.Start(Application.StartupPath + @"\update.exe");
              Close();
              Application.Exit();
       }    
(5)编写客户端的Update.Exe 
Update.exe的功能主要是:首先就是找到主进程;如果没有关闭,则用Process.Kill()来关闭主程序。然后则用一个XmlDocument来Load程序生成的update.xml文件。用xml文件里指定的路径和文件名来生成指定的文件,在这之前先前已经存在的文件删除。更新完毕后,则重新启动主应用程序。这样更新就完成了。
       private void Form1_Load(object sender, System.EventArgs e)
       {
              System.Diagnostics.Process[] ps = System.Diagnostics.Process.GetProcesses();
              foreach(System.Diagnostics.Process p in ps)
              {
                     //MessageBox.Show(p.ProcessName);
                     if(p.ProcessName.ToLower()=="customerapplication")
                     {
                            p.Kill();
                            break;
                     }
              }
              XmlDocument doc = new XmlDocument();
              doc.Load(Application.StartupPath + @"\update.xml");
              XmlElement root = doc.DocumentElement;
              XmlNode updateNode = root.SelectSingleNode("filelist");
              string path = updateNode.Attributes["sourcepath"].Value;
              int count = int.Parse(updateNode.Attributes["count"].Value);
              for(int i=0;i= updateNode.ChildNodes[i];
                     string fileName = itemNode.Attributes["name"].Value;
                     FileInfo fi = new FileInfo(fileName);
                     fi.Delete();
                     //File.Delete(Application.StartupPath + @"\" + fileName);
                     this.label1.Text = "正在更新:" + fileName + " (" + itemNode.Attributes["size"].Value + ") ...";
                FileStream fs = File.Open(fileName,FileMode.Create,FileAccess.Write);    fs.Write(System.Convert.FromBase64String(itemNode.SelectSingleNode("value").InnerText),0,int.Parse(itemNode.Attributes["size"].Value));
               fs.Close();
            }
              label1.Text = "更新完成";
              File.Delete(Application.StartupPath + @"\update.xml");
              label1.Text = "正在重新启动应用程序...";
              System.Diagnostics.Process.Start("CustomerApplication.exe");
              Close();
              Application.Exit();
       }
这里为了简单起见,没有使用异步方法,当然使用异步方法能更好的避免并发调用产生的冲突,这个需要读者自己去添加。
4 结束语
借助Web Services实现软件的自动升级,不仅设计简单,实现起来也很容易,取得了良好的效应,大大减轻了维护的工作量。本方案具有较好的参考价值。
参考文献
[1] 杨继家,张丽静,张晓蕾.面向C/S模式下的客户端软件自动升级的实现[J].微计算机应用,2005(5),290-293
YANG Ji-jia,ZHANG Li-jing,ZHANG Xiao-lei.An realization of Automatically updating orienting to C/S Application System[J].Microcomputer Applications,2005(5),290-293
[2] 何航校,蒋兆远.一种改进的通用客户端自动升级模型及实现[J].兰州交通大学学报(自然科学版),2005(8),110-113
    HE Hang-xiao,JIANG Zhao-yuan.An Improved Universal Auto Upgrade Model of Client and its Realization.Journal of Lanzhou Jiaotong University (Natural Sciences),2005(8),110-113
[3] 乌云高娃.动态升级在MIS 系统中的实现与应用[J].计算机工程与设计,2005(10),2854-2856
WUYUN Gao-wa.Implementation and application of dynamic upgrade technique in MIS[J].Computer Engineering and Design,2005(10),2854-2856
[4] 叶利华,陶宏才,梁田.基于COM的软件在线升级技术[J].成都信息工程学院学报,2005(2),73-75
   YE Li-hua,TAO Hong-cai,LIANG Tian.Software live updating technology based on COM[J].Journal of Chengdu University of Information Technology,2005(2),73-75
[5] 余颖,董旭源,高宏.C/S模式管理信息系统实现自动升级和维护的方法[J].佳木斯大学学报(自然科学版),2005(4),200-202
    YU Ying,DONG Xu-yuan,GAO Hong.Methods to Perform Upgrade and Maintenance in C/S Mode Management Information System[J],2005(4),200-202
Implementation of software auto-update by Web Services
CAO Qing-Xu

Abstract: The software maintaining and updating is an important section in the software life cycle. This paper makes use of the technology of Web Services、C# and XML Language, to resolve the poor efficiency of client’s updating in old C/S application system. The automatically updating program can detect the new version, download the updating file, automatically backup and rollback. It makes the software updating by the client automatically, and it is practical.
Keywords: C#;Web Services;XML;software auto-update

[转载]利用Web Services实现软件自动升级相关推荐

  1. 利用Web Services实现软件自动升级

    摘 要:软件维护升级工作是软件生命周期最重要的环节.为了解决以往C/S(Client/Server)模式下的客户端软件升级效率低的问题,设计了C/S应用系统自动升级处理程序.该程序利用Web Serv ...

  2. 软件自动升级系统:支持exe程序覆盖更新、目录结构、更新更新程序自身、更新sql、执行bat批处理...

    软件自动升级系统说明 目录 一.         自动升级需要需要实现些什么?... 1 二.         服务器安装... 2 三.         客户端配置... 4 四.         ...

  3. HTML5进阶(二)HBuilder实现软件自动升级

    HBuilder实现软件自动升级 前言 移动APP开发好后需要实现软件自动升级功能,经过一番搜索,发现HBuilder具有"App资源在线升级更新"的功能,遂研究之. 经过一番测试 ...

  4. WPF开发一款软件自动升级组件

    前几天介绍了WPF进行自定义窗口的开发,关注的朋友还挺多,超出本人意料,呵呵,那么我就再接再励,在上篇的基础上,讲述一下软件自动升级组件的开发原理,大家时间宝贵,不想搞太长的篇幅,所以尽可能拣重要的说 ...

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

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

  6. 在WinForm中使用Web Service来实现软件自动升级

    来源:互联网 winform程序相对web程序而言,功能更强大编程更方便,但软件更新却相当麻烦,要到客户端一台一台地升级,面对这个实际问题,在最近的一个小项目中,本人设计了一个通过软件实现自动升级技术 ...

  7. 利用Web Services开发分布式应用

    一.引言 在前面文章中分别介绍了MSMQ和.NET Remoting技术,今天继续分享.NET 平台下另一种分布式技术--Web Services 二.Web Services 详细介绍 2.1 We ...

  8. 利用权限禁止QQ的自动升级(QQUpdateCenter)

    我很少写一些软件技巧性的文章,不过有时候不得以,有了这些需求,但是从网上又找不到非常满意的解决方案.所以在自己找到后,非常愿意写出来和大家分享. 最近在Vista下使用最新版本的QQ(兼容Vista) ...

  9. C# 实现在线软件自动升级自动下载更新文件

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

最新文章

  1. OAF TABLE中添加序号列
  2. macOS查看IP地址的命令
  3. web FG interview all
  4. Echarts图表位置调整
  5. gigabyte计算机主板图解,gigabyte主板bios设置方法
  6. 笔记本或台式机进入BIOS的快捷键
  7. OpenGL日常-GLAD
  8. 菜单栏、工具栏、状态栏
  9. ifrog 1130 喵哈哈村的魔法大师╳灬兲笙疯癫°月 缩点+最小路径覆盖+背包
  10. Linux基本命令 初级10个
  11. 金蝶k3单据编码规则_金蝶K3财务操作手册
  12. Axure RP8 下载、安装、破解、汉化一条龙服务
  13. 最优化理论·非线性最小二乘
  14. 快速学习COSMIC方法之九:如何识别兴趣对象?
  15. SSL证书绑定了顶级域名后二级域名还需再申请吗
  16. HDMI 1.4 协议
  17. 登高车的使用注意事项及具体操作步骤有哪些?
  18. 渝粤题库 陕西师范大学 《旅游法规》作业
  19. 教师如何创建百度百科词条?这篇带你了解
  20. 刘智聪-将Web3进行到底

热门文章

  1. 求是潮android最新版,求是潮手机站最新版
  2. Qt 调用ftd2x API上位机踩坑指南
  3. VS Code修改系统界面和编辑面板字体大小
  4. python高级编程-网络编程、多任务
  5. AsyncTaskLoader1 自定义AsyncTaskLoader使用实例:面包师
  6. 移动端行驶证、驾驶证识别OCR—移动互联神器
  7. 关于android webview 端调原生app 的支付宝接口实现 还有BeeCloud(秒支付) 的接入使用
  8. 3天学会HTML:day1 基础
  9. Scrapy爬取新浪微博用户信息、用户微博及其微博评论转发
  10. 如何优雅的DIY一个高大上的小台灯