使用C#的WebService實現用戶端軟體的線上升級功能

來源:互聯網
上載者:User

前言:
由於項目原因,要實施的客戶離作者(itbaby)太遠,考慮提供軟體的線上升級功能.我們如何?呢!先講下思路.

思路:
先實現WEB端的開發,主要考慮使用WEBService技術,提供遠程服務的調用函數,返回一個檔案的位元組內容,然後寫一個升級程式用戶端,分發給客戶使用的機器中,(可以隨客戶的軟體一起安裝).該用戶端程式主要串連webserivce,然後將檔案儲存到本地機(客戶的機器)中.就可以實現!

實現的細節:
要考慮提供給客戶軟體版本問題,低版本的升級,最新版本的就不用升級.還要考慮使用者名稱與密碼在WEB端的認證!

使用技術:
ASP.Net WebService開發,用戶端的非同步呼叫WebService方法.資料庫技術!


如果轉載請說明出處,http://blog.csdn.net/zerodj
作者首頁:http://itbaby.jss.cn
注意:itbaby.jss.cn中,技術文章不再更新,全部轉到blog.csdn.net/zerodj中.


開始實現:

1.建立資料庫,作者(itbaby)使用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()的方法名稱,提供給你使用

作者首頁:itbaby.jss.cn
郵件:zerodj@163.com  

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.