VS.NET(C#) WebService更新客户端软件

  • 本文主要先从思路、细节、技术讲解使用C# WebService实现客户端软件的更新应用,作者结合简明的代码实例,详细分析了客户端软件远程更新的思路。
  •  

    先实现 WEB端的开发,主要考虑使用WEBService技术,提供远程服务的调用函数 。由于项目原因,要实施的客户离作者太远,考虑提供软件的在线升级功能.我们C# WebService来实现。先讲下思路.

    思路:

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

    实现的细节:

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

    使用技术:

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

    开始实现:

      
      
    1. 1.建立数据库,使用SQLSERVER2000  
    2. 1)软件项目表:softlist(softid, softname,   
    3. resume, loginname, loginpwd)  
    4. softid:编号  
    5. softname:软件名称  
    6. resume:介绍  
    7. loginname:客户登录名  
    8. loginpwd:密码  
    9.  
    10.  
    11. 2)各个软件的版本表 SoftListVersion(softid, subid,   
    12. version, UpdatePath, olefile)  
    13. softid:主表的软件编号  
    14. subid:各版本数据编号  
    15. version:软件版本  
    16. filename:升级文件名  
    17. olefile:升级文件的二进制内容,是image类型,  
    18. (我主要存放MSI的安装包文件类型,可以使用C#做此类安装包文件)  
    19.  
    20. 3)建立一个视图,chkVersion,用于检查版本号  
    21. SELECT dbo.SoftListVersion.subid, dbo.softlist.  
    22. softname, dbo.SoftListVersion.version  
    23. FROM dbo.softlist INNER JOIN 
    24. dbo.SoftListVersion ON dbo.softlist.softid =   
    25. dbo.SoftListVersion.softid  
    26.  
    27. 4)再建立一个视图,vOleFile,用于下载文件  
    28. SELECT dbo.SoftListVersion.subid, dbo.softlist.  
    29. softname, dbo.SoftListVersion.filename,  
    30. dbo.SoftListVersion.olefile, dbo.SoftListVersion.version  
    31. FROM dbo.softlist INNER JOIN 
    32. dbo.SoftListVersion ON dbo.softlist.softid =   
    33. dbo.SoftListVersion.softid  
    34.  
    35. 2.写一个WEBSERVICE  
    36. 1)启动VS.Net2003,建立一个叫babyWebSvc的项目,  
    37. 项目类型为(ASP.Net WEB服务)  
    38. 2)添加一个SoftUpdate.asmx的WEB服务  
    39.  
    40. 3)添加一个方法SearchVersion  
    41.  
    42. [WebMethod(Description=”  
    43. 返回当前软件升级包的最高版本”)]  
    44. public string SearchVersion(string softname)  
    45. {  
    46. string sVersion = ””;  
    47. webmod.dbConnStart(); //  
    48. (连接)作者自己的连接数据库类,用户自己完成数据库连接  
    49. string strSQL = ”select MAX(version) as   
    50. MaxVerID from chkVersion where softname = @softname”;  
    51. SqlCommand sqlCmd = new SqlCommand(strSQL,webmod.sqlConn);  
    52. sqlCmd.CommandTimeout = 0;  
    53. sqlCmd.Parameters.Add(”@softname”,SqlDbType.VarChar).  
    54. Value = softname;  
    55. SqlDataReader sqlRd = sqlCmd.ExecuteReader();  
    56. if(sqlRd.HasRows)  
    57. {  
    58. sqlRd.Read();  
    59. sVersion = Convert.ToString(sqlRd[”MaxVerID”]);  
    60. }  
    61. sqlRd.Close();  
    62.  
    63. webmod.dbConnEnd(); //(断开连接)作者自己的连接数据库类,  
    64. 用户自己完成数据库连接  
    65.  
    66. return sVersion;  
    67. }  
    68.  
    69. 4)添加下载文件内容的方法DownloadSoft  
    70.  
    71. [WebMethod(Description=”返回需要下载的文件字节”)]  
    72. public byte[] DownloadSoft(string UserName,string PassWord,  
    73. string SoftDnldName,string SoftHeightVersion)  
    74. {  
    75. //(连接)作者自己的连接数据库类,用户自己完成数据库连接  
    76. webmod.dbConnStart();  
    77.  
    78. //检查用户合法性  
    79. bool bMember = CheckAuth(UserName,PassWord);  
    80. //该WebService内的一个检查用户合法性的函数,用户可以自己完成  
    81. if(!bMember)  
    82. {  
    83. webmod.dbConnEnd();  
    84. return null;  
    85. }  
    86. byte[] b = null;  
    87.  
    88. //我们取出指定软件名称的最高版本的升级包  
    89. string strSQL = ”select olefile from vOleFile where   
    90. (filename=@softname) and version=@ver”;  
    91. SqlCommand sqlCmd = new SqlCommand(strSQL,webmod.sqlConn);  
    92. sqlCmd.CommandTimeout = 0;  
    93. sqlCmd.Parameters.Add(”@softname”,SqlDbType.VarChar).  
    94. Value = SoftDnldName;  
    95. sqlCmd.Parameters.Add(”@ver”, SqlDbType.VarChar).  
    96. Value = SoftHeightVersion;  
    97. SqlDataReader sqlRd = sqlCmd.ExecuteReader();  
    98. if(sqlRd.HasRows)  
    99. {  
    100. sqlRd.Read();  
    101. b = (byte[])sqlRd[”olefile”];//文件的字节内容  
    102. }  
    103. sqlRd.Close();  
    104.  
    105. //(断开连接)作者自己的连接数据库类,用户自己完成数据库连接  
    106. webmod.dbConnEnd();  
    107. return b;  
    108. }  

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

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

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

    App.Config文件的内容

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

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

      
      
    1. private void Form1_Load(object sender,   
    2. System.EventArgs e)  
    3. {  
    4. //读出版本号,该版本号是在AssemblyInfo.cs  
    5. 中由系统本身设置的,[assembly: AssemblyVersion(”1.0”)]  
    6. //以后要更改,可以改此处的AssemblyInfo.cs中的版本号,  
    7. 例:[assembly: AssemblyVersion(”1.1”)]  
    8. //我们的WEBSERVICE中需要这个数据做为参数  
    9. string sVersion = Application.ProductVersion;  
    10.  
    11. //写到App.Cofing文件中,每次调用WEBSERVICE方法时,  
    12. 从App.Cofing中读取版本,你也可以直接使用Application.  
    13. ProductVersion,我是为了统一管理,全部从config中读取  
    14. this.SaveAppConfig(”Version”,sVersion);  
    15. }  
    16.  
    17. //SaveAppConfig函数的内容  
    18. public static void SaveAppConfig  
    19. (string AppKey,string AppValue)  
    20. {  
    21. XmlDocument xDoc = new XmlDocument();  
    22. xDoc.Load(Application.ExecutablePath + ”.config”);  
    23.  
    24. XmlNode xNode;  
    25. XmlElement xElem1;  
    26. XmlElement xElem2;  
    27.  
    28. xNode = xDoc.SelectSingleNode(”//appSettings”);  
    29.  
    30. xElem1 = (XmlElement)xNode.SelectSingleNode(  
    31. ”//add[@key=” + AppKey + ”]”);  
    32. if ( xElem1 != null ) xElem1.SetAttribute(”  
    33. value”,AppValue);  
    34. else 
    35. {  
    36. xElem2 = xDoc.CreateElement(”add”);  
    37. xElem2.SetAttribute(”key”,AppKey);  
    38. xElem2.SetAttribute(”value”,AppValue);  
    39. xNode.AppendChild(xElem2);  
    40. }  
    41. xDoc.Save(Application.ExecutablePath + ”.config”);  
    42. }  

    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,主要使用异步调用

      
      
    1. private string svcUser = ””;  
    2. private string svcPwd = ””;  
    3. private string svcSoftName = ””;  
    4. private string svcCurrVersion = ””;  
    5. private string svcDnldFileName = ”Test.MSI”;  
    6. //下载下来的文件名,  
    7. private byte[] fbyte = null;   
    8. //下载后的升级文件的内容  
    9. private void Button1_Click(object sender,   
    10. System.EventArgs e)  
    11. {  
    12. //读取App.config文件中的配置信息  
    13. svcUser = System.Configuration.  
    14. ConfigurationSettings.AppSettings[”user”];   
    15. //需要人证的用户名  
    16. svcPwd = System.Configuration.  
    17. ConfigurationSettings.AppSettings[”pwd”];  
    18.  //认证密码  
    19. svcSoftName = System.Configuration.  
    20. ConfigurationSettings.AppSettings  
    21. [”babyRecordSoftName”];//软件名称  
    22. svcCurrVersion = System.Configuration.  
    23. ConfigurationSettings.AppSettings[”Version”];  
    24. //当前版本号  
    25.  
    26. try  
    27. {  
    28. AutoUpdateWebSvc.SoftUpdate aSvc =   
    29. new AutoUpdateWebSvc.SoftUpdate();  
    30.  
    31. //此处可以改成自己实际应用时的URL,  
    32. 不管WEB引用是动态还是静态,调用都会指向该URL  
    33. aSvc.Url = ”  
    34. http://localhost/babyWebSvc/SoftUpdate.asmx”;  
    35.  
    36. if(Button1.Text.Trim() == ”检 查”)  
    37. {  
    38. //检查最新版本  
    39. System.AsyncCallback cb = new AsyncCallback  
    40. (SearchVersionCallBack);//异步回调方法,  
    41. 并检查是否有高版本的升级软件存在  
    42. aSvc.BeginSearchVersion(svcSoftName,cb,aSvc);  
    43. }  
    44. else if(Button1.Text.Trim() == ”升 级”)  
    45. {  
    46. //开始调用下载服务  
    47. InvokeDownload(); //函数体见下面的CODE  
    48. }  
    49.  
    50. }  
    51. catch(Exception ex)  
    52. {  
    53. MessageBox.Show(ex.Message);  
    54. }  
    55. }  
    56.  
    57.  
    58. //检查最新版本的异步回调方法  
    59. private void SearchVersionCallBack(System.  
    60. IAsyncResult ar)  
    61. {  
    62. if(ar==null)return;  
    63. if(ar.IsCompleted)  
    64. {  
    65. try  
    66. {  
    67. AutoUpdateWebSvc.SoftUpdate aSvc =   
    68. (AutoUpdateWebSvc.SoftUpdate)ar.AsyncState;  
    69. string sVersion = aSvc.EndSearchVersion(ar);  
    70. aSvc.Dispose();  
    71.  
    72.  
    73. if(svcCurrVersion.Trim() == sVersion.Trim())  
    74. MessageBox.Show”你的软件当前版本已经是最新的了,  
    75. 无需进行升级...”);  
    76. else if((string.Compare(svcCurrVersion.Trim(),  
    77. sVersion.Trim()))==-1)  
    78. {  
    79.  
    80. MessageBox.Show(”你的软件当前版本比较低,  
    81. 可以进行升级...”);  
    82. Button1.Text = ”升 级”;  
    83. }  
    84.  
    85. }  
    86. catch(Exception ex)  
    87. {  
    88. MessageBox.Show(ex.Message);  
    89. }  
    90. }  
    91. }  
    92.  
    93. //调用远程的WEB服务,开始下载  
    94. private void InvokeDownload()  
    95. {  
    96. try  
    97. {  
    98. AutoUpdateWebSvc.SoftUpdate aSvc =   
    99. new AutoUpdateWebSvc.SoftUpdate();  
    100. //此处可以改成自己实际应用时的URL,  
    101. 不管WEB引用是动态还是静态,调用都会指向该URL  
    102. aSvc.Url = ”  
    103. http://localhost/babyWebSvc/SoftUpdate.asmx”;  
    104.  
    105. //开始下载  
    106. System.AsyncCallback cb =   
    107. new AsyncCallback(DownloadSoftCallBack);  
    108. //异步回调方法,保存文件  
    109. aSvc.BeginDownloadSoft(svcUser,svcPwd,  
    110. svcDnldFileName,lblVersion.Text.Trim(),cb,aSvc);  
    111.  
    112. }  
    113. catch(Exception ex)  
    114. {  
    115. MessageBox.Show(ex.Message);  
    116. }  
    117. }  
    118.  
    119. //下载方法执行完成后,异步回调方法  
    120. private void DownloadSoftCallBack(System.  
    121. IAsyncResult ar)  
    122. {  
    123. if(ar==null)  
    124. {  
    125. MessageBox.Show(”升级过程中出现错误,  
    126. 不能进行升级,请稍后再试...”);  
    127. return;  
    128. }  
    129. if(ar.IsCompleted)  
    130. {  
    131. try  
    132. {  
    133. AutoUpdateWebSvc.SoftUpdate aSvc =   
    134. (AutoUpdateWebSvc.SoftUpdate)ar.AsyncState;  
    135. fbyte = aSvc.EndDownloadSoft(ar);  
    136. aSvc.Dispose();  
    137.  
    138. //使用线程,保存文件  
    139. Thread th = new Thread(new ThreadStart(Save2Disk));  
    140. th.Start();  
    141.  
    142. }  
    143. catch(Exception ex)  
    144. {  
    145. MessageBox.Show(”升级过程中出现错误,”+ex.Message);  
    146. }  
    147. }  
    148. }  
    149.  
    150.  
    151. //将下载下来的字节数组保存成文件  
    152. private void Save2Disk()  
    153. {  
    154. try  
    155. {  
    156. FileInfo finfo = new FileInfo  
    157. (Application.ExecutablePath+svcDnldFileName);  
    158. if(finfo.Exists)finfo.Delete();//文件存在就删除它  
    159. Stream stream = finfo.OpenWrite();  
    160.  
    161. prosBar.Maximum = fbyte.Length;//prosBar是一个进度条  
    162. prosBar.Minimum = 0;  
    163. prosBar.Step = 1;  
    164. int i=0;  
    165. foreach(byte b in fbyte)  
    166. {  
    167. stream.WriteByte(b);  
    168. prosBar.Value += 1;  
    169. }  
    170. stream.Flush();  
    171. stream.Close();  
    172.  
    173. DialogResult dr = MessageBox.Show  
    174. (”下载完成,是否现在就安装升级程序...”,”  
    175. 提示信息”,MessageBoxButtons.OKCancel,  
    176. MessageBoxIcon.Information,MessageBoxDefaultButton.  
    177. Button1);  
    178. if(dr == DialogResult.OK)  
    179. {  
    180. ExecSetup();//启动下载下来的安装程序,用户可以自己完成  
    181. }  
    182. }  
    183. catch(Exception ex)  
    184. {  
    185. MessageBox.Show(”升级过程中出现错误,”+ex.Message);  
    186. }  
    187. uiButton2.Enabled = true;  
    188. }  

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

    经过上面的步骤,就基本实现了C# WebService更新客户端软件。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值