[转载]如何利用Web Services如何实现软件自动升级

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