`
jiasongmao
  • 浏览: 681019 次
  • 性别: Icon_minigender_1
  • 来自: 石家庄
社区版块
存档分类
最新评论

使用C#的WebService实现客户端软件升级

    博客分类:
  • .NET
阅读更多
由于项目原因,要实施的客户离作者太远,考虑提供软件的在线升级功能.我们如何实现呢!先讲下思路.

思路:
先实现WEB端的开发,主要考虑使用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#winfrom客户端自动更新升级 webservice

    本文将深入讲解如何使用C# WinFrom客户端结合WebService实现自动更新升级的功能。 首先,我们要理解C# WinFrom客户端。C#是一种面向对象的编程语言,广泛应用于Windows桌面应用开发,WinForm则是C#中的用户界面框架...

    C#实现的通过webservice 获取服务器端 程序实现 系统自动升级

    通过设计良好的WebService接口和客户端调用逻辑,可以实现平滑、可靠的升级过程,提高用户的满意度和软件安全性。记住,自动化是现代软件开发的重要趋势,而系统自动升级是其中不可或缺的一部分。

    c#应用webService实现自动升级源代码

    总的来说,利用C#和WebService实现的自动升级功能,不仅提高了软件的更新效率,也提升了用户的使用体验。开发过程中需要注意的是,安全性和稳定性同样重要,例如确保下载过程的可靠性,防止恶意攻击,以及妥善处理...

    C# 自动更新程序WebService

    总结来说,C# 自动更新程序通过调用WebService获取更新信息,然后利用WebClient下载更新文件,实现软件的无缝升级。这个过程中,开发者需要注意安全性、用户体验以及网络连接的可靠性。了解并掌握这些技术,将有助于...

    C#版WebService测试

    4. **调用服务**:调用C#编写的WebService可以使用多种方式,如SOAP客户端、HTTP POST请求或者使用.NET的`System.Net.WebClient`或`HttpClient`类。以下是一个简单的示例: ```csharp using System; using System...

    基于WebService的自升级框架WebSAUFc#源码

    一个ClickOnce替代方案:基于WebService的可扩展客户端自升级框架WebSAUF,具有功能:配置升级清单、指定升级方式、确定压缩形式、设定安装文件夹等,既可以升级客户端程序自己或其它程序文件,也可以发布数据库等非...

    基于WebService的C/S框架

    开发者可以使用各种编程语言(如Java、C#)和库(如.NET的ASMX或WCF)来创建客户端代理类,这些代理类可以透明地处理SOAP消息的发送和接收。 2. 服务器端开发:服务器端实现具体的业务逻辑,对外提供WebService。...

    基于.net环境的WebService开发资料

    本开发资料主要围绕.NET Framework下的WebService开发进行,包括C#语言的实现和源码分析。下面将详细阐述相关知识点。 1. **SOAP与WSDL** - SOAP(Simple Object Access Protocol)是WebService的核心协议,用于...

    webservice接口调用实例

    Web服务(Web Service)是一种基于互联网的、使用标准XML(Extensible Markup Language)进行通信的软件服务,允许不同系统间的应用程序进行交互。本实例主要关注的是如何调用Web Service接口,我们将探讨相关的关键...

    c# 操作webservice(经典入门教程+MSDN).docx

    ### C# 操作WebService(经典入门教程+MSDN) #### WebService根本概念 WebService是一种能够接收来自Internet或Intranet上其他系统的请求的轻量级、独立的通信技术。它通常通过SOAP(Simple Object Access ...

    MESWebService.zip

    1. **SOAP与RESTful API**:WebService通常有两种主要的实现方式,即简单对象访问协议(SOAP)和 Representational State Transfer(RESTful)。SOAP是基于WSDL(Web服务描述语言)的标准,适合复杂的数据交换;而...

    Webservice 开发工具书

    它提供了强大的Webservice客户端和服务器端实现,支持多种编程模型,如ASMX、SOAP with Attachments等。 3. NetBeans:NetBeans是另一款开源的IDE,同样集成了Web服务开发功能。它内置了对JAX-WS(Java API for XML...

    webservice-axis2

    Webservice的核心在于它的平台无关性和语言无关性,这意味着一个使用Java编写的Webservice可以被任何支持HTTP协议的客户端调用,无论这个客户端是用C#、Python还是其他任何语言编写。 #### 二、Axis2:高效的...

    解决Delphi7因数据执行保护导致的Webservice无法访问错误

    软件DEP则由Windows操作系统实现,它会监控进程的内存分配,如果发现有试图在数据页面上执行代码的行为,就会触发一个错误并终止进程。 针对Delphi 7的Web Service调用问题,我们可以采取以下策略来解决DEP引发的...

    Webservice上传文件和断点续传

    在本场景中,"Webservice上传文件和断点续传"指的是利用WebService技术实现大文件的分段上传,允许在网络不稳定或中断后从上次中断的位置继续上传,提高文件传输的可靠性和效率。 首先,理解断点续传的基本原理:...

    WebService axis2

    客户端调用WebService可以通过多种编程语言实现,常见的有Java和C#。使用Java时,可以直接通过HTTP URL调用或使用`javax.xml.rpc.Service`类结合WSDL文件创建代理类进行调用。对于C#,则可通过.NET Framework提供的`...

    web service第一次启动慢

    - 优化服务器配置:升级服务器硬件,增加内存和CPU资源,或者优化web service的代码逻辑,减少不必要的资源消耗。 - 分析数据库性能:确保数据库连接和查询优化,使用索引、预加载数据或优化数据访问逻辑,减少...

    webService总结1

    总结起来,WebService是软件系统间进行交互的重要手段,通过规范化的接口和协议,实现了不同平台和语言间的互操作性,促进了企业级应用的集成与扩展。在实际开发中,利用如CXF这样的框架,可以高效地构建和消费Web ...

    webservice的cxf框架拦截器demo.rar

    这部分可能包含了客户端的代码,展示了如何在CXF客户端使用拦截器。客户端拦截器可以用来处理请求的构建和响应的解析,例如,添加身份验证信息或者对返回的数据进行解密。 5. **“1.rtf”**: 这可能是一个RTF...

    WebService大讲堂之Axis2.pdf

    - **C#客户端调用**:同样支持从C#环境中调用基于Axis2发布的Web服务,通常借助.NET Framework提供的`System.Web.Services`命名空间中的类来实现。 #### 5. 进阶主题 - **复合类型数据传递**:详细介绍如何处理复杂...

Global site tag (gtag.js) - Google Analytics