国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

使用C#的WebService實現客戶端軟件的在線升級功能

2024-07-21 02:26:20
字體:
來源:轉載
供稿:網友

前言:
由于項目原因,要實施的客戶離作者(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 ([email protected]) and [email protected]";
   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("http://appsettings");

   xelem1 = (xmlelement)xnode.selectsinglenode("http://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()的方法名稱,提供給你使用 



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 新郑市| 来宾市| 淳安县| 延川县| 津南区| 桦甸市| 白水县| 横峰县| 舞阳县| 邓州市| 会同县| 左权县| 海门市| 五华县| 龙口市| 本溪市| 长岭县| 泰来县| 资兴市| 临漳县| 中西区| 乌兰县| 光山县| 奉贤区| 佛坪县| 潼南县| 阳原县| 喀什市| 普宁市| 安国市| 灵寿县| 临桂县| 襄垣县| 安徽省| 女性| 南阳市| 明星| 高雄市| 古蔺县| 广德县| 明星|