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. C#中定义装箱和拆箱详解
  2. 浅谈C#类型系统
  3. 三种不同的C#异常类型
  4. 详细介绍C#编译器
  5. C#异常机制的相关解释
责任编辑:冰荷 来源: e800
相关推荐

2009-08-07 13:55:35

Java客户端类调用C# WebServi

2020-03-19 08:00:00

客户端KubernetesAPI

2009-08-21 16:14:52

服务端与客户端通信

2009-08-21 15:59:22

服务端与客户端通信

2009-08-21 15:36:41

服务端与客户端

2009-08-21 15:54:40

服务端与客户端

2009-08-21 17:48:43

C#网络编程

2009-08-21 17:53:25

C#网络编程客户端程序

2009-08-21 14:33:15

C#异步传输字符串

2011-04-07 09:33:01

Activex

2010-08-13 10:50:12

FlashFlexWebService

2009-08-21 16:37:54

C#客户端程序

2023-11-03 08:15:27

PythonC#

2015-08-17 09:48:29

C#客户端分布式缓存

2013-08-28 13:36:04

2021-09-22 15:46:29

虚拟桌面瘦客户端胖客户端

2011-08-17 10:10:59

2011-08-25 10:37:15

leveldb的访问封C#客户端源码

2010-05-31 10:11:32

瘦客户端

2011-03-24 13:00:31

配置nagios客户端
点赞
收藏

51CTO技术栈公众号