<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      使用C#的WebService實現客戶端軟件的更新

      由于項目原因,要實施的客戶離作者太遠,考慮提供軟件的在線升級功能.我們如何實現呢!先講下思路.

      思路:
      先實現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("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()的方法名稱,提供給你使用

      posted @ 2009-07-08 15:10  .NET快速開發框架  閱讀(1302)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 国产成人影院一区二区三区| 在线观看精品视频网站| √天堂中文www官网在线| 我和亲妺妺乱的性视频| AV秘 无码一区二| 国产精品亚洲а∨天堂2021| 四虎在线成人免费观看| 成年女性特黄午夜视频免费看| 午夜福利理论片高清在线| 91老肥熟女九色老女人| 黑人av无码一区| 野外做受三级视频| 国产欧美亚洲精品a第一页| 在线免费播放av日韩| 亚洲美免无码中文字幕在线| 国产果冻豆传媒麻婆精东| 亚洲国产精品久久久天堂麻豆宅男| 日本高清视频在线www色| 国产成人自拍小视频在线| 亚洲蜜臀av乱码久久| 国产精品美女乱子伦高| 亚欧洲乱码视频一二三区| 欧美成人看片黄A免费看| 日韩中文字幕免费在线观看| 日韩亚洲精品中文字幕| 亚洲色成人网站www永久男男| 久久综合开心激情五月天| 人人澡人摸人人添| 精品无码久久久久久尤物| 欧美丰满熟妇xxxx性ppx人交| 亚洲中文字幕乱码电影| 国产一区二区不卡在线| 亚洲爆乳WWW无码专区| 镇雄县| 亚洲av永久无码精品网站| 亚洲国产成人久久综合三区| 国产精成人品日日拍夜夜| 午夜福利免费视频一区二区| 亚洲欧美日本久久网站| 亚洲精品午夜精品| 老鸭窝|