C#如何使用WebService更新客户端软件
更新:HHH   时间:2023-1-7


这篇文章将为大家详细讲解有关C#如何使用WebService更新客户端软件,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

思路:

先实现 WEB端的开发,主要考虑使用C# WebService技术,提供远程服务的调用函数,返回一个文件的字节内容,然后写一个升级程序客户端,分发给客户使用的机器中,(可以随客户的软件一起安装).该客户端程序主要连接webserivce,然后将文件保存到本地机(客户的机器)中.就可以实现!

实现的细节:

要考虑提供给客户软件版本问题,低版本的升级,***版本的就不用升级.还要考虑用户名与密码在WEB端的认证!

使用技术:

ASP.Net WebService开发,客户端的异步调用WebService方法.数据库技术!

开始实现:

1.建立数据库,使用SQLSERVER2000  1)软件项目表:softlist(softid, softname,   resume, loginname, loginpwd)  softid:编号  softname:软件名称  resume:介绍  loginname:客户登录名  loginpwd:密码    2)各个软件的版本表 SoftListVersion(softid, subid,   version, UpdatePath, olefile)  softid:主表的软件编号  subid:各版本数据编号  version:软件版本  filename:升级文件名  olefile:升级文件的二进制内容,是image类型,  (我主要存放MSI的安装包文件类型,可以使用C#做此类安装包文件)   3)建立一个视图,chkVersion,用于检查版本号  SELECT dbo.SoftListVersion.subid, dbo.softlist.  softname, dbo.SoftListVersion.version  FROM dbo.softlist INNER JOIN dbo.SoftListVersion ON dbo.softlist.softid =   dbo.SoftListVersion.softid   4)再建立一个视图,vOleFile,用于下载文件  SELECT dbo.SoftListVersion.subid, dbo.softlist.  softname, dbo.SoftListVersion.filename,  dbo.SoftListVersion.olefile, dbo.SoftListVersion.version  FROM dbo.softlist INNER JOIN dbo.SoftListVersion ON dbo.softlist.softid =   dbo.SoftListVersion.softid   2.写一个WEBSERVICE  1)启动VS.Net2003,建立一个叫babyWebSvc的项目,  项目类型为(ASP.Net WEB服务)  2)添加一个SoftUpdate.asmx的WEB服务   3)添加一个方法SearchVersion   [WebMethod(Description=”  返回当前软件升级包的***版本”)]  public string SearchVersion(string softname)  {  string sVersion = ””;  webmod.dbConnStart(); //  (连接)作者自己的连接数据库类,用户自己完成数据库连接  string strSQL = ”select MAX(version) as   MaxVerID from chkVersion where softname = @softname”;  SqlCommand sqlCmd = new SqlCommand(strSQL,webmod.sqlConn);  sqlCmd.CommandTimeout = 0;  sqlCmd.Parameters.Add(”@softname”,SqlDbType.VarChar).  Value = softname;  SqlDataReader sqlRd = sqlCmd.ExecuteReader();  if(sqlRd.HasRows)  {  sqlRd.Read();  sVersion = Convert.ToString(sqlRd[”MaxVerID”]);  }  sqlRd.Close();   webmod.dbConnEnd(); //(断开连接)作者自己的连接数据库类,  用户自己完成数据库连接   return sVersion;  }   4)添加下载文件内容的方法DownloadSoft   [WebMethod(Description=”返回需要下载的文件字节”)]  public byte[] DownloadSoft(string UserName,string PassWord,  string SoftDnldName,string SoftHeightVersion)  {  //(连接)作者自己的连接数据库类,用户自己完成数据库连接  webmod.dbConnStart();   //检查用户合法性  bool bMember = CheckAuth(UserName,PassWord);  //该WebService内的一个检查用户合法性的函数,用户可以自己完成  if(!bMember)  {  webmod.dbConnEnd();  return null;  }  byte[] b = null;   //我们取出指定软件名称的***版本的升级包  string strSQL = ”select olefile from vOleFile where   (filename=@softname) and version=@ver”;  SqlCommand sqlCmd = new SqlCommand(strSQL,webmod.sqlConn);  sqlCmd.CommandTimeout = 0;  sqlCmd.Parameters.Add(”@softname”,SqlDbType.VarChar).  Value = SoftDnldName;  sqlCmd.Parameters.Add(”@ver”, SqlDbType.VarChar).  Value = SoftHeightVersion;  SqlDataReader sqlRd = sqlCmd.ExecuteReader();  if(sqlRd.HasRows)  {  sqlRd.Read();  b = (byte[])sqlRd[”olefile”];//文件的字节内容  }  sqlRd.Close();   //(断开连接)作者自己的连接数据库类,用户自己完成数据库连接  webmod.dbConnEnd();  return b;  }

3.WEB服务的方法完成后,你自己可以启动,测试,我们现在来写客户端的升级程序,假定你在开发时的WEBSERVICE的URL为:http://localhost/babywebsvc/SoftUpdate.asmx,注意这个URL,我们是要在客户端引用的

4.启动VS.Net2003,建立一个C#的Windows项目,在默认的FORM上添加一个按钮,

5.添加一个新的文件类型(应用程序配置文件)App.config

App.Config文件的内容

〈?xml version=”1.0” encoding=”utf-8”?〉  〈configuration〉  〈appSettings〉  〈add key=”user” value=”test”/〉  〈add key=”pwd” value=”test”/〉  〈add key=”babyRecordSoftName” value=”  TEST.EXE”/〉〈!--记录在远程的数据库中的软件名称--〉  〈add key=”Version” value=”1.0”/〉  〈/appSettings〉  〈/configuration〉

6.我们在Form启动的LOAD事件中,添加如下代码

private void Form1_Load(object sender,   System.EventArgs e)  {  //读出版本号,该版本号是在AssemblyInfo.cs  中由系统本身设置的,[assembly: AssemblyVersion(”1.0”)]  //以后要更改,可以改此处的AssemblyInfo.cs中的版本号,  例:[assembly: AssemblyVersion(”1.1”)]  //我们的WEBSERVICE中需要这个数据做为参数  string sVersion = Application.ProductVersion;   //写到App.Cofing文件中,每次调用WEBSERVICE方法时,  从App.Cofing中读取版本,你也可以直接使用Application.  ProductVersion,我是为了统一管理,全部从config中读取  this.SaveAppConfig(”Version”,sVersion);  }   //SaveAppConfig函数的内容  public static void SaveAppConfig  (string AppKey,string AppValue)  {  XmlDocument xDoc = new XmlDocument();  xDoc.Load(Application.ExecutablePath + ”.config”);   XmlNode xNode;  XmlElement xElem1;  XmlElement xElem2;   xNode = xDoc.SelectSingleNode(”//appSettings”);   xElem1 = (XmlElement)xNode.SelectSingleNode(  ”//add[@key=” + AppKey + ”]”);  if ( xElem1 != null ) xElem1.SetAttribute(”  value”,AppValue);  else {  xElem2 = xDoc.CreateElement(”add”);  xElem2.SetAttribute(”key”,AppKey);  xElem2.SetAttribute(”value”,AppValue);  xNode.AppendChild(xElem2);  }  xDoc.Save(Application.ExecutablePath + ”.config”);  }

7.主要部分,开始调用webservice的方法!

准备工作:1)添加一个WEB引用,(先点菜单”项目”-”添加WEB引用”),

在弹出中输入url的路径:http://localhost/babywebsvc/SoftUpdate.asmx

2)假定你在开发时的WEBSERVICE的URL:http://localhost/babywebsvc/SoftUpdate.asmx

3)填入WEB引用名:AutoUpdateWebSvc

4)点下按纽完成WEB引用的添加

8.在你的Button1_click事件中添加如下CODE,主要使用异步调用

private string svcUser = ””;  private string svcPwd = ””;  private string svcSoftName = ””;  private string svcCurrVersion = ””;  private string svcDnldFileName = ”Test.MSI”;  //下载下来的文件名,  private byte[] fbyte = null;   //下载后的升级文件的内容  private void Button1_Click(object sender,   System.EventArgs e)  {  //读取App.config文件中的配置信息  svcUser = System.Configuration.  ConfigurationSettings.AppSettings[”user”];   //需要人证的用户名  svcPwd = System.Configuration.  ConfigurationSettings.AppSettings[”pwd”];   //认证密码  svcSoftName = System.Configuration.  ConfigurationSettings.AppSettings  [”babyRecordSoftName”];//软件名称  svcCurrVersion = System.Configuration.  ConfigurationSettings.AppSettings[”Version”];  //当前版本号   try  {  AutoUpdateWebSvc.SoftUpdate aSvc =   new AutoUpdateWebSvc.SoftUpdate();   //此处可以改成自己实际应用时的URL,  不管WEB引用是动态还是静态,调用都会指向该URL  aSvc.Url = ”  http://localhost/babyWebSvc/SoftUpdate.asmx”;   if(Button1.Text.Trim() == ”检 查”)  {  //检查***版本  System.AsyncCallback cb = new AsyncCallback  (SearchVersionCallBack);//异步回调方法,  并检查是否有高版本的升级软件存在  aSvc.BeginSearchVersion(svcSoftName,cb,aSvc);  }  else if(Button1.Text.Trim() == ”升 级”)  {  //开始调用下载服务  InvokeDownload(); //函数体见下面的CODE  }   }  catch(Exception ex)  {  MessageBox.Show(ex.Message);  }  }    //检查***版本的异步回调方法  private void SearchVersionCallBack(System.  IAsyncResult ar)  {  if(ar==null)return;  if(ar.IsCompleted)  {  try  {  AutoUpdateWebSvc.SoftUpdate aSvc =   (AutoUpdateWebSvc.SoftUpdate)ar.AsyncState;  string sVersion = aSvc.EndSearchVersion(ar);  aSvc.Dispose();    if(svcCurrVersion.Trim() == sVersion.Trim())  MessageBox.Show”你的软件当前版本已经是***的了,  无需进行升级...”);  else if((string.Compare(svcCurrVersion.Trim(),  sVersion.Trim()))==-1)  {   MessageBox.Show(”你的软件当前版本比较低,  可以进行升级...”);  Button1.Text = ”升 级”;  }   }  catch(Exception ex)  {  MessageBox.Show(ex.Message);  }  }  }   //调用远程的WEB服务,开始下载  private void InvokeDownload()  {  try  {  AutoUpdateWebSvc.SoftUpdate aSvc =   new AutoUpdateWebSvc.SoftUpdate();  //此处可以改成自己实际应用时的URL,  不管WEB引用是动态还是静态,调用都会指向该URL  aSvc.Url = ”  http://localhost/babyWebSvc/SoftUpdate.asmx”;   //开始下载  System.AsyncCallback cb =   new AsyncCallback(DownloadSoftCallBack);  //异步回调方法,保存文件  aSvc.BeginDownloadSoft(svcUser,svcPwd,  svcDnldFileName,lblVersion.Text.Trim(),cb,aSvc);   }  catch(Exception ex)  {  MessageBox.Show(ex.Message);  }  }   //下载方法执行完成后,异步回调方法  private void DownloadSoftCallBack(System.  IAsyncResult ar)  {  if(ar==null)  {  MessageBox.Show(”升级过程中出现错误,  不能进行升级,请稍后再试...”);  return;  }  if(ar.IsCompleted)  {  try  {  AutoUpdateWebSvc.SoftUpdate aSvc =   (AutoUpdateWebSvc.SoftUpdate)ar.AsyncState;  fbyte = aSvc.EndDownloadSoft(ar);  aSvc.Dispose();   //使用线程,保存文件  Thread th = new Thread(new ThreadStart(Save2Disk));  th.Start();   }  catch(Exception ex)  {  MessageBox.Show(”升级过程中出现错误,”+ex.Message);  }  }  }    //将下载下来的字节数组保存成文件  private void Save2Disk()  {  try  {  FileInfo finfo = new FileInfo  (Application.ExecutablePath+svcDnldFileName);  if(finfo.Exists)finfo.Delete();//文件存在就删除它  Stream stream = finfo.OpenWrite();   prosBar.Maximum = fbyte.Length;//prosBar是一个进度条  prosBar.Minimum = 0;  prosBar.Step = 1;  int i=0;  foreach(byte b in fbyte)  {  stream.WriteByte(b);  prosBar.Value += 1;  }  stream.Flush();  stream.Close();   DialogResult dr = MessageBox.Show  (”下载完成,是否现在就安装升级程序...”,”  提示信息”,MessageBoxButtons.OKCancel,  MessageBoxIcon.Information,MessageBoxDefaultButton.  Button1);  if(dr == DialogResult.OK)  {  ExecSetup();//启动下载下来的安装程序,用户可以自己完成  }  }  catch(Exception ex)  {  MessageBox.Show(”升级过程中出现错误,”+ex.Message);  }  uiButton2.Enabled = true;  }

9:总结,客户端调用,是从,点击Buttton1开始,搜索版本号,SearchVersion,当找到高版本升级包时,开始执行下载的方法DownloadSoft,然后保存到本地Save2Disk.不管客户端的调用是同步还是异步,WEBService的方法都是一样写的,只不过同步调用,是直接使用WEBService中的方法名称,异步调用则会由系统自动生成BeginXXX()与EndXXX()的方法名称,提供给你使用。

关于“C#如何使用WebService更新客户端软件”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

返回编程语言教程...