使用Web Services 来实现软件自动升级的实践

原创 2004年06月24日 10:26:00

文件update.xml:

<?xml version="1.0" encoding="utf-8" ?>
<product>
<version>1.2</version>
<description>语音程序正式版发布</description>
<filelist count="2" sourcepath="./update/">
<item name="WindowsApplication2.exe" size="" >
<value />
</item>
<item name="Interop.SpeechLib.dll" size="">
<value />
</item>
</filelist>
</product>

服务端websvs.asmx代码:

namespace WebSvs
{
 [WebService(Namespace="http://10.16.80.22/WebSvs/")]

 public class UpdateSvs : System.Web.Services.WebService
 {
  //自动生成的代码略......

  [WebMethod(Description="取得软件最新版本信息")]
  public string GetVer()
  {
   XmlDocument doc = new XmlDocument();
   doc.Load(Server.MapPath("update.xml"));
   XmlElement root = doc.DocumentElement;

   return root.SelectSingleNode("version").InnerText;
  }

  [WebMethod(Description="在线更新软件")]
  public System.Xml.XmlDocument GetUpdateData()
  {
   //取得更新的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<count;i++)
   {
    XmlNode itemNode = 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;
  }

 }
}

客户端主程序代码:

namespace WindowsApplication2
{
 //自动生成的代码略......
 public class Form1 : System.Windows.Forms.Form
 { 
  //先要添加web引用http://10.16.80.22/websvs/websvs.asmx,命名为zwt_svs
  private static zwt_svs.UpdateSvs upd ;
  
  //主程序的处理函数略......

  void update()
  {
   System.Xml.XmlDocument doc = new System.Xml.XmlDocument();

   System.Xml.XmlNode tmpNode = upd.GetUpdateData();

   doc.AppendChild(doc.ImportNode(tmpNode,true));
   doc.Save(Application.StartupPath + @"/update.xml");
   
   System.Diagnostics.Process.Start(Application.StartupPath + @"/update.exe");
   Close();
   Application.Exit();
  }

  private void Form1_Load(object sender, System.EventArgs e)
  {
   this.Text += Application.ProductVersion.ToString();

   try
   {
    upd = new zwt_svs.UpdateSvs();
    string nVer=upd.GetVer();
   
    //软件版本号在AssemblyInfo.cs中指定
    if(Application.ProductVersion.CompareTo(nVer)<0)
     update();
   }
   catch (Exception ex)
   {
    MessageBox.Show("发生异常:"+ex.Message);
    Close();
    Application.Exit();
   }
  }

 }
}


更新程序update.cs代码:

namespace update
{
 public class UpdateForm : System.Windows.Forms.Form
 {
  //自动生成的代码略...... 
  Thread tid;

  private void DoUpdate()
  {
   Process[] myProcesses ;

   try
   {
    myProcesses = Process.GetProcessesByName("windowsapplication2");

    if(myProcesses.Length > 0)
    {
     foreach(Process myProcess in myProcesses)
     {
      myProcess.Kill();
     }
    }

    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<count;i++)
    {
     XmlNode itemNode = updateNode.ChildNodes[i];
     string fileName = itemNode.Attributes["name"].Value;
     FileInfo fi = new FileInfo(fileName);
     fi.Delete();
    
     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("WindowsApplication2.exe");
    Close();

    Application.Exit();
   }
   catch (Exception ex)
   {
    MessageBox.Show("Caught Exception .... : " + ex.Message);
    Close();
    Application.Exit();
   }     
     
  }

  private void Form1_Load(object sender, System.EventArgs e)
  {
   //新起一个线程进行程序更新
   tid = new Thread(new ThreadStart(this.DoUpdate));
   tid.Start();
  }

  private void button1_Click(object sender, System.EventArgs e)
  {
   tid.Abort();
   Close();
   Application.Exit();
  }
  
 }
}

在WinForm中使用Web Services 来实现 软件 自动升级( Auto Update ) (C#)

winform程序相对web程序而言,功能更强大,编程更方便,但软件更新却相当麻烦,要到客户端一台一台地升级,面对这个实际问题,在最近的一个小项目中,本人设计了一个通过软件实现自动升级技术方案,弥补了...
  • skyover
  • skyover
  • 2004年06月08日 10:09
  • 1851

WinForm、ASP.NET Web服务实现简单的自动更新

  • 2012年10月24日 11:12
  • 984KB
  • 下载

WinForm中使用Web Services 来实现 软件 自动升级

在WinForm中使用Web Services 来实现 软件 自动升级( Auto Update ) (C#)2007-01-06 14:52:50 / 个人分类:升级模块 winform程序相对we...
  • ytbada
  • ytbada
  • 2007年01月09日 13:25
  • 464

利用webservice实现软件自动更新

利用webservice实现软件自动更新(auto update) 2009-11-16 12:02 545人阅读 评论(4) 收藏 举报  winform程序相对web...
  • best_caohit
  • best_caohit
  • 2012年08月07日 18:29
  • 870

在C#中实现软件自动升级

winform程序相对web程序而言,功能更强大,编程更方便,但软件更新却相当麻烦,要到客户端一台一台地升级,本文结合实际情况,通过软件实现自动升级,弥补了这一缺陷,有较好的参考价值。由于程序在运行时...
  • tongdoudpj
  • tongdoudpj
  • 2007年08月09日 17:58
  • 667

自动升级系统的设计与实现(源码)

对于PC桌面应用程序而言,自动升级功能往往是必不可少的。而自动升级可以作为一个独立的C/S系统来开发,这样,就可以在不同的桌面应用中进行复用。基于ESFramework的文件传送功能,我实现了一个可直...
  • zhuweisky
  • zhuweisky
  • 2014年08月22日 14:35
  • 4718

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

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

实现软件自动在线升级的原理

写两个程序,一个是主程序;一个是升级程序;所有升级任务都由升级程序完成。  1.启动升级程序,升级程序连接到网站,下载新的主程序(当然还包括支持的库文件、XML配置文档等)到临时文件夹; ...
  • hrwm2015
  • hrwm2015
  • 2014年12月03日 15:21
  • 1358

Python 实现简单的C/S在线更新程序

使用urllib 直接下载html 服务端 Respones把 安装包msi 的二进制流 输出,客户端判断下载下来的文件大小, 一般很小 就有可能是404等信息,只需判断文件大小来决定是否运行更新...
  • xugangjava
  • xugangjava
  • 2013年01月25日 16:24
  • 3767

在C#中实现软件自动升级(方法2)

Winform程序相对web程序而言,功能更强大,编程更方便,但软件更新却相当麻烦,要到客户端一台一台地升级,本文结合实际情况,通过软件实现自动升级,弥补了这一缺陷,有较好的参考价值。winform程...
  • Kevins_Leader
  • Kevins_Leader
  • 2006年03月15日 04:22
  • 848
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用Web Services 来实现软件自动升级的实践
举报原因:
原因补充:

(最多只允许输入30个字)