前言:
由于項目原因,要實施的客戶離作者(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()的方法名稱,提供給你使用
新聞熱點
疑難解答