淺析WebService客戶端應(yīng)用方法
2024-07-21 02:21:21
供稿:網(wǎng)友
 
.net平臺內(nèi)建了對web service的支持,包括web service的構(gòu)建和使用。 與其它開發(fā)平臺不同,使用.net平臺,你不需要其他的工具或者sdk就可以完成web service的開發(fā)了。.net framework本身就全面支持web service,包括服務(wù)器端的請求處理器和對客戶端發(fā)送和接受soap消息的支持。本文將帶你用.net創(chuàng)建和使用web service。 
  一 在.net中創(chuàng)建web service 
  要在.net中創(chuàng)建web service,你只需在你的解決方案中選擇"文件/添加新項",彈出如下圖1所示的對話框: 
 
  圖1 
  在此框中,選擇"web服務(wù)",并指定名稱。vs.net將為你建立一個缺省的webservice框架。根據(jù)需要,你可以建立所需的webservice方法。 
  如下代碼是從sql server 2000的northwind數(shù)據(jù)庫employees中返回所有employee信息的webservice方法。 
[webmethod]
public string getemployees()
{
string cnstr="server=njim01;database=northwind;uid=sa;pwd=64084888;";
string rsstring;
sqlconnection cn=new sqlconnection(cnstr);
sqldataadapter cmd=new sqldataadapter("select * from employees",cn);
dataset ds=new dataset();
datatable tbl;
cmd.fill(ds,"employees");
tbl=ds.tables["employees"];
rsstring="<table border=/"0/" bgcolor=/"blue/" cellpadding=/"1/"
   cellspacing=/"1/"><tr bgcolor=/"white/">";
for(int i=0;i<=ds.tables["employees"].columns.count-1;i++)
{
rsstring+="<td>"+ds.tables["employees"].columns[i].columnname+"</td>"; 
}
rsstring+="</tr>";
for(int i=0;i<tbl.rows.count;i++)
{
rsstring+="<tr bgcolor=/"white/">";
for(int j=0;j<=ds.tables["employees"].columns.count-1;j++)
{
rsstring+="<td>"+tbl.rows[i][j]+"</td>";
}
rsstring+="</tr>";
}
rsstring+="</table>";
return rsstring;
}
 
  由此可見,在vs.net中建立一個webservice是方便的。 
  二 webservice在客戶端的應(yīng)用 
  通過對vs.net長期應(yīng)用和研究,我們總結(jié)出webservice在客戶端應(yīng)用的方法主要有以下四種可能: 
  1、 在同一個解決方案中調(diào)用webservice方法; 
  2、 在不同的解決方案中調(diào)用webservice方法; 
  3、 在internet上調(diào)用webservice方法; 
  4、 利用webservice.htc調(diào)用webservice方法。 
  以下對上述四種方法分別進(jìn)行介紹。 
  1、在同一個解決方案中調(diào)用webservice方法 
首先,我們需要建立一個名為mytest.sln的解決方案。該方案由一個名為testform.aspx的web表單和一個testservice.asmx的webservice組成。testform.aspx的代碼如下: 
sqldataadapter cmd=new sqldataadapter("select * from employees",cn);
dataset ds=new dataset();
datatable tbl;
cmd.fill(ds,"employees");
tbl=ds.tables["employees"];
rsstring="<table border=/"0/" bgcolor=/"blue/" cellpadding=/"1/"
   cellspacing=/"1/"><tr bgcolor=/"white/">";
for(int i=0;i<=ds.tables["employees"].columns.count-1;i++)
{
rsstring+="<td>"+ds.tables["employees"].columns[i].columnname+"</td>"; 
}
rsstring+="</tr>";
for(int i=0;i<tbl.rows.count;i++)
{
rsstring+="<tr bgcolor=/"white/">";
for(int j=0;j<=ds.tables["employees"].columns.count-1;j++)
{
rsstring+="<td>"+tbl.rows[i][j]+"</td>";
}
rsstring+="</tr>";
}
rsstring+="</table>";
return rsstring;
}
 
  從以上代碼可以看出,在testform表單中,我們僅提供了一個testwebservice按鈕,當(dāng)我們單擊testwebservice時,使用一個名為msg的<span>來顯示testwebservice中方法的返回值。 
  在testwebservice.asmx中,我們僅建立一個方法,該方法代碼如下: 
[webmethod]
public string getemployees()
{
string cnstr="server=njim01;database=northwind;uid=sa;pwd=6408;";
string rsstring;
sqlconnection cn=new sqlconnection(cnstr);
sqldataadapter cmd=new sqldataadapter("select * from employees",cn);
dataset ds=new dataset();
datatable tbl;
cmd.fill(ds,"employees");
tbl=ds.tables["employees"];
rsstring="<table border=/"0/" bgcolor=/"blue/" cellpadding=/"1/" 
  cellspacing=/"1/"><tr bgcolor=/"white/">";
for(int i=0;i<=ds.tables["employees"].columns.count-1;i++)
{
rsstring+="<td>"+ds.tables["employees"].columns[i].columnname+"</td>"; 
}
rsstring+="</tr>";
for(int i=0;i<tbl.rows.count;i++)
{
rsstring+="<tr bgcolor=/"white/">";
for(int j=0;j<=ds.tables["employees"].columns.count-1;j++)
{
rsstring+="<td>"+tbl.rows[i][j]+"</td>";
}
rsstring+="</tr>";
}
rsstring+="</table>";
return rsstring;
}
 
private void button4_click(object sender, system.eventargs e)
{
testwebservice webservice=new testwebservice();
msg.innerhtml=webservice.getcustomers();
}
 
  事實上,在同一個解決方案中對本方案中的webservice方法的調(diào)用就是通過類的方式進(jìn)行定義和調(diào)用的。 
  2、在不同的解決方案中調(diào)用webservice方法 有可能我們的webservice不是在同一個解決方案建立的,比如我們在先前的方案中已經(jīng)建立。現(xiàn)在我們要在新的解決方案中對它的方法進(jìn)行調(diào)用。 
  在此可分為兩種情況: 
  1、雖然webservice不在要調(diào)用它的解決方案中,但在同一臺物理主機(jī)上; 
  2、webservice和解決方案不在同一臺物理主機(jī)上,如我們要調(diào)用microsoft的webservice樣例,它在: 
    http://chs.gotdotnet.com/quickstart/aspplus/samples/ 
      services/dataservice/vb/dataservice.asmx 
  位置。如何調(diào)用? 
  1) 在同一臺物理主機(jī)上也有兩種調(diào)用方法: 
 ?、僦苯右?直接引用含有webservice解決方案的dll。例如我們在另外一個名 
  為webservice.sln的解決方案中建立了一個名為math.asmx的webservice,在這個webservice中我們編寫了一個方法: 
[webmethod]
public float add(float x,float y)
{
 return x+y;
}
 
  下面我們要在testform.aspx表單中調(diào)用該方法: 
  首先,我們在testform.aspx表單中增加一個新按鈕,名稱為reference。 
  其次,我們在mytest.sln解決方案的引用中將webservice.dll添加進(jìn)來。 
  第三,對reference按鈕的reference_click()編碼如下: 
private void reference_click(object sender, system.eventargs e)
{
float x,y;
webservice.math math1=new webservice.math(); 
/*在此定義了webservice對象math1*/
x=11.88f;
y=23.19f;
msg.innerhtml=math1.add(x,y).tostring();
/*在此調(diào)用了math1對象的add()方法,并將結(jié)果顯示在名為msg的<span>上*/
}
 
  當(dāng)我們單擊reference按鈕時,add()方法調(diào)用的結(jié)果便顯示在名為msg的<span>標(biāo)記中。 
 ?、趙eb引用 事實上,vs.net提供了無比強(qiáng)大的功能,使得我們沒有必要直接去引用一個webservice解決方案的dll。我們只需在"引用"上右擊,選擇"添加web引用……",此時彈出如下圖2所示的窗口: 
 
  圖2 
  在地址欄中輸入要調(diào)用webservice的位置,如 
      http://localhost:8088/webservice/math.asmx 
  此時,在mytest.sln下增加了一個"web引用"文件夾,在此文件夾下有一個"localhost1"項目,如下圖3: 
  圖3 
  圖中web引用文件夾下的localhost1便是對另一個解決方案中的webservice引用。下面我們來看如何按這種引用方式在testform.aspx表單中調(diào)用該webservice方法: 
  首先,我們在testform.aspx表單中增加一個新按鈕,命名為localhost1。 
  在localhost1按鈕的localhost1_click()事件中編碼如下: 
private void localhost1_click(object sender, system.eventargs e)
{
float x,y;
localhost1.math math1=new localhost1.math();
/*在此定義了webservice對象math1*/
x=16.1f;
y=17.89f;
msg.innerhtml=math1.add(x,y).tostring();
/*在此調(diào)用了math1對象的add()方法,并將結(jié)果顯示在名為msg的<span>上*/
}
 
  當(dāng)我們單擊localhost1按鈕時,這段代碼同樣完成了相應(yīng)的方法調(diào)用。 
  3、在internet上調(diào)用webservice方法 事實上,在第2種情形的"web引用"方式是當(dāng)前情況的一個特例。因為,當(dāng)我們將web引用地址欄的地址改為指向internet上某臺主機(jī)上的一個webservice時便是在internet上調(diào)用webservice方法。 
  不妨讓我們調(diào)用microsoft asp.net快速入門中的webservice樣例,我們在添加"web引用"時,在地址欄中輸入下面的webservice 地址: 
      http://chs.gotdotnet.com/quickstart/aspplus/samples/ 
        services/dataservice/vb/dataservice.asmx 
  如圖3所示,在"web引用"文件夾下可以看見已經(jīng)添加了一個新項目"com.gotdotnet.chs",在testform.aspx表單中再新增一個按鈕gowebservice,在gowebservice的click()事件中編碼如下: 
private void gowebservice_click(object sender, system.eventargs e)
{
com.gotdotnet.chs.dataservice gows=new com.gotdotnet.chs.dataservice();
/*在此定義了webservice對象gows*/
dataset ds=new dataset();
ds=gows.gettitleauthors();
/*在此調(diào)用了gows對象的gettitleauthors()方法,該方法返回一個dataset對象*/
msg.innerhtml=ds.tables["authors"].rows.count.tostring();
/*在此將authors表的記錄條數(shù)顯示在名為msg的<span>上*/
}
 
  當(dāng)我們單擊gowebservice按鈕后,對internet上microsoft asp.net快速入門中的webservice樣例的調(diào)用同樣也會顯示在msg上。 
  4、利用webservice.htc調(diào)用webservice方法 此方法不在贅述,請參看microsoft站點。 
  <b>三 結(jié)束語</b> 
  總之,webservice的功能非常強(qiáng)大,但在客戶端如何調(diào)用webservice方法卻難以找到相應(yīng)的介紹,致使多數(shù)開發(fā)人員使用第4種方法,本人根據(jù)自己對vs.net的應(yīng)用經(jīng)驗總結(jié)了以上幾種方法,僅供vs.net開發(fā)人員參考!