C# WebService更新客戶(hù)端軟件
先實(shí)現(xiàn) WEB端的開(kāi)發(fā),主要考慮使用WEBService技術(shù),提供遠(yuǎn)程服務(wù)的調(diào)用函數(shù) 。由于項(xiàng)目原因,要實(shí)施的客戶(hù)離作者太遠(yuǎn),考慮提供軟件的在線(xiàn)升級(jí)功能.我們C# WebService來(lái)實(shí)現(xiàn)。先講下思路.
思路:
先實(shí)現(xiàn) WEB端的開(kāi)發(fā),主要考慮使用C# WebService技術(shù),提供遠(yuǎn)程服務(wù)的調(diào)用函數(shù),返回一個(gè)文件的字節(jié)內(nèi)容,然后寫(xiě)一個(gè)升級(jí)程序客戶(hù)端,分發(fā)給客戶(hù)使用的機(jī)器中,(可以隨客戶(hù)的軟件一起安裝).該客戶(hù)端程序主要連接webserivce,然后將文件保存到本地機(jī)(客戶(hù)的機(jī)器)中.就可以實(shí)現(xiàn)!
實(shí)現(xiàn)的細(xì)節(jié):
要考慮提供給客戶(hù)軟件版本問(wèn)題,低版本的升級(jí),***版本的就不用升級(jí).還要考慮用戶(hù)名與密碼在WEB端的認(rèn)證!
使用技術(shù):
ASP.Net WebService開(kāi)發(fā),客戶(hù)端的異步調(diào)用WebService方法.數(shù)據(jù)庫(kù)技術(shù)!
開(kāi)始實(shí)現(xiàn):
- 1.建立數(shù)據(jù)庫(kù),使用SQLSERVER2000
- 1)軟件項(xiàng)目表:softlist(softid, softname,
- resume, loginname, loginpwd)
- softid:編號(hào)
- softname:軟件名稱(chēng)
- resume:介紹
- loginname:客戶(hù)登錄名
- loginpwd:密碼
- 2)各個(gè)軟件的版本表 SoftListVersion(softid, subid,
- version, UpdatePath, olefile)
- softid:主表的軟件編號(hào)
- subid:各版本數(shù)據(jù)編號(hào)
- version:軟件版本
- filename:升級(jí)文件名
- olefile:升級(jí)文件的二進(jìn)制內(nèi)容,是image類(lèi)型,
- (我主要存放MSI的安裝包文件類(lèi)型,可以使用C#做此類(lèi)安裝包文件)
- 3)建立一個(gè)視圖,chkVersion,用于檢查版本號(hào)
- 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)再建立一個(gè)視圖,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.寫(xiě)一個(gè)WEBSERVICE
- 1)啟動(dòng)VS.Net2003,建立一個(gè)叫babyWebSvc的項(xiàng)目,
- 項(xiàng)目類(lèi)型為(ASP.Net WEB服務(wù))
- 2)添加一個(gè)SoftUpdate.asmx的WEB服務(wù)
- 3)添加一個(gè)方法SearchVersion
- [WebMethod(Description=”
- 返回當(dāng)前軟件升級(jí)包的***版本”)]
- public string SearchVersion(string softname)
- {
- string sVersion = ””;
- webmod.dbConnStart(); //
- (連接)作者自己的連接數(shù)據(jù)庫(kù)類(lèi),用戶(hù)自己完成數(shù)據(jù)庫(kù)連接
- 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(); //(斷開(kāi)連接)作者自己的連接數(shù)據(jù)庫(kù)類(lèi),
- 用戶(hù)自己完成數(shù)據(jù)庫(kù)連接
- return sVersion;
- }
- 4)添加下載文件內(nèi)容的方法DownloadSoft
- [WebMethod(Description=”返回需要下載的文件字節(jié)”)]
- public byte[] DownloadSoft(string UserName,string PassWord,
- string SoftDnldName,string SoftHeightVersion)
- {
- //(連接)作者自己的連接數(shù)據(jù)庫(kù)類(lèi),用戶(hù)自己完成數(shù)據(jù)庫(kù)連接
- webmod.dbConnStart();
- //檢查用戶(hù)合法性
- bool bMember = CheckAuth(UserName,PassWord);
- //該WebService內(nèi)的一個(gè)檢查用戶(hù)合法性的函數(shù),用戶(hù)可以自己完成
- if(!bMember)
- {
- webmod.dbConnEnd();
- return null;
- }
- byte[] b = null;
- //我們?nèi)〕鲋付ㄜ浖Q(chēng)的***版本的升級(jí)包
- 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”];//文件的字節(jié)內(nèi)容
- }
- sqlRd.Close();
- //(斷開(kāi)連接)作者自己的連接數(shù)據(jù)庫(kù)類(lèi),用戶(hù)自己完成數(shù)據(jù)庫(kù)連接
- webmod.dbConnEnd();
- return b;
- }
3.WEB服務(wù)的方法完成后,你自己可以啟動(dòng),測(cè)試,我們現(xiàn)在來(lái)寫(xiě)客戶(hù)端的升級(jí)程序,假定你在開(kāi)發(fā)時(shí)的WEBSERVICE的URL為:http://localhost/babywebsvc/SoftUpdate.asmx,注意這個(gè)URL,我們是要在客戶(hù)端引用的
4.啟動(dòng)VS.Net2003,建立一個(gè)C#的Windows項(xiàng)目,在默認(rèn)的FORM上添加一個(gè)按鈕,
5.添加一個(gè)新的文件類(lèi)型(應(yīng)用程序配置文件)App.config
App.Config文件的內(nèi)容
- 〈?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”/〉〈!--記錄在遠(yuǎn)程的數(shù)據(jù)庫(kù)中的軟件名稱(chēng)--〉
- 〈add key=”Version” value=”1.0”/〉
- 〈/appSettings〉
- 〈/configuration〉
6.我們?cè)贔orm啟動(dòng)的LOAD事件中,添加如下代碼
- private void Form1_Load(object sender,
- System.EventArgs e)
- {
- //讀出版本號(hào),該版本號(hào)是在AssemblyInfo.cs
- 中由系統(tǒng)本身設(shè)置的,[assembly: AssemblyVersion(”1.0”)]
- //以后要更改,可以改此處的AssemblyInfo.cs中的版本號(hào),
- 例:[assembly: AssemblyVersion(”1.1”)]
- //我們的WEBSERVICE中需要這個(gè)數(shù)據(jù)做為參數(shù)
- string sVersion = Application.ProductVersion;
- //寫(xiě)到App.Cofing文件中,每次調(diào)用WEBSERVICE方法時(shí),
- 從App.Cofing中讀取版本,你也可以直接使用Application.
- ProductVersion,我是為了統(tǒng)一管理,全部從config中讀取
- this.SaveAppConfig(”Version”,sVersion);
- }
- //SaveAppConfig函數(shù)的內(nèi)容
- 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.主要部分,開(kāi)始調(diào)用webservice的方法!
準(zhǔn)備工作:1)添加一個(gè)WEB引用,(先點(diǎn)菜單”項(xiàng)目”-”添加WEB引用”),
在彈出中輸入url的路徑:http://localhost/babywebsvc/SoftUpdate.asmx
2)假定你在開(kāi)發(fā)時(shí)的WEBSERVICE的URL:http://localhost/babywebsvc/SoftUpdate.asmx
3)填入WEB引用名:AutoUpdateWebSvc
4)點(diǎn)下按紐完成WEB引用的添加
8.在你的Button1_click事件中添加如下CODE,主要使用異步調(diào)用
- private string svcUser = ””;
- private string svcPwd = ””;
- private string svcSoftName = ””;
- private string svcCurrVersion = ””;
- private string svcDnldFileName = ”Test.MSI”;
- //下載下來(lái)的文件名,
- private byte[] fbyte = null;
- //下載后的升級(jí)文件的內(nèi)容
- private void Button1_Click(object sender,
- System.EventArgs e)
- {
- //讀取App.config文件中的配置信息
- svcUser = System.Configuration.
- ConfigurationSettings.AppSettings[”user”];
- //需要人證的用戶(hù)名
- svcPwd = System.Configuration.
- ConfigurationSettings.AppSettings[”pwd”];
- //認(rèn)證密碼
- svcSoftName = System.Configuration.
- ConfigurationSettings.AppSettings
- [”babyRecordSoftName”];//軟件名稱(chēng)
- svcCurrVersion = System.Configuration.
- ConfigurationSettings.AppSettings[”Version”];
- //當(dāng)前版本號(hào)
- try
- {
- AutoUpdateWebSvc.SoftUpdate aSvc =
- new AutoUpdateWebSvc.SoftUpdate();
- //此處可以改成自己實(shí)際應(yīng)用時(shí)的URL,
- 不管WEB引用是動(dòng)態(tài)還是靜態(tài),調(diào)用都會(huì)指向該URL
- aSvc.Url = ”
- http://localhost/babyWebSvc/SoftUpdate.asmx”;
- if(Button1.Text.Trim() == ”檢 查”)
- {
- //檢查***版本
- System.AsyncCallback cb = new AsyncCallback
- (SearchVersionCallBack);//異步回調(diào)方法,
- 并檢查是否有高版本的升級(jí)軟件存在
- aSvc.BeginSearchVersion(svcSoftName,cb,aSvc);
- }
- else if(Button1.Text.Trim() == ”升 級(jí)”)
- {
- //開(kāi)始調(diào)用下載服務(wù)
- InvokeDownload(); //函數(shù)體見(jiàn)下面的CODE
- }
- }
- catch(Exception ex)
- {
- MessageBox.Show(ex.Message);
- }
- }
- //檢查***版本的異步回調(diào)方法
- 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”你的軟件當(dāng)前版本已經(jīng)是***的了,
- 無(wú)需進(jìn)行升級(jí)...”);
- else if((string.Compare(svcCurrVersion.Trim(),
- sVersion.Trim()))==-1)
- {
- MessageBox.Show(”你的軟件當(dāng)前版本比較低,
- 可以進(jìn)行升級(jí)...”);
- Button1.Text = ”升 級(jí)”;
- }
- }
- catch(Exception ex)
- {
- MessageBox.Show(ex.Message);
- }
- }
- }
- //調(diào)用遠(yuǎn)程的WEB服務(wù),開(kāi)始下載
- private void InvokeDownload()
- {
- try
- {
- AutoUpdateWebSvc.SoftUpdate aSvc =
- new AutoUpdateWebSvc.SoftUpdate();
- //此處可以改成自己實(shí)際應(yīng)用時(shí)的URL,
- 不管WEB引用是動(dòng)態(tài)還是靜態(tài),調(diào)用都會(huì)指向該URL
- aSvc.Url = ”
- http://localhost/babyWebSvc/SoftUpdate.asmx”;
- //開(kāi)始下載
- System.AsyncCallback cb =
- new AsyncCallback(DownloadSoftCallBack);
- //異步回調(diào)方法,保存文件
- aSvc.BeginDownloadSoft(svcUser,svcPwd,
- svcDnldFileName,lblVersion.Text.Trim(),cb,aSvc);
- }
- catch(Exception ex)
- {
- MessageBox.Show(ex.Message);
- }
- }
- //下載方法執(zhí)行完成后,異步回調(diào)方法
- private void DownloadSoftCallBack(System.
- IAsyncResult ar)
- {
- if(ar==null)
- {
- MessageBox.Show(”升級(jí)過(guò)程中出現(xiàn)錯(cuò)誤,
- 不能進(jìn)行升級(jí),請(qǐng)稍后再試...”);
- return;
- }
- if(ar.IsCompleted)
- {
- try
- {
- AutoUpdateWebSvc.SoftUpdate aSvc =
- (AutoUpdateWebSvc.SoftUpdate)ar.AsyncState;
- fbyte = aSvc.EndDownloadSoft(ar);
- aSvc.Dispose();
- //使用線(xiàn)程,保存文件
- Thread th = new Thread(new ThreadStart(Save2Disk));
- th.Start();
- }
- catch(Exception ex)
- {
- MessageBox.Show(”升級(jí)過(guò)程中出現(xiàn)錯(cuò)誤,”+ex.Message);
- }
- }
- }
- //將下載下來(lái)的字節(jié)數(shù)組保存成文件
- 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是一個(gè)進(jìn)度條
- 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
- (”下載完成,是否現(xiàn)在就安裝升級(jí)程序...”,”
- 提示信息”,MessageBoxButtons.OKCancel,
- MessageBoxIcon.Information,MessageBoxDefaultButton.
- Button1);
- if(dr == DialogResult.OK)
- {
- ExecSetup();//啟動(dòng)下載下來(lái)的安裝程序,用戶(hù)可以自己完成
- }
- }
- catch(Exception ex)
- {
- MessageBox.Show(”升級(jí)過(guò)程中出現(xiàn)錯(cuò)誤,”+ex.Message);
- }
- uiButton2.Enabled = true;
- }
9:總結(jié),客戶(hù)端調(diào)用,是從,點(diǎn)擊Buttton1開(kāi)始,搜索版本號(hào),SearchVersion,當(dāng)找到高版本升級(jí)包時(shí),開(kāi)始執(zhí)行下載的方法DownloadSoft,然后保存到本地Save2Disk.不管客戶(hù)端的調(diào)用是同步還是異步,WEBService的方法都是一樣寫(xiě)的,只不過(guò)同步調(diào)用,是直接使用WEBService中的方法名稱(chēng),異步調(diào)用則會(huì)由系統(tǒng)自動(dòng)生成BeginXXX()與EndXXX()的方法名稱(chēng),提供給你使用。
經(jīng)過(guò)上面的步驟,就基本實(shí)現(xiàn)了C# WebService更新客戶(hù)端軟件。
【編輯推薦】