首頁  >  文章  >  後端開發  >  Flex與.NET互通(三):基於WebService的資料存取(下)

Flex與.NET互通(三):基於WebService的資料存取(下)

巴扎黑
巴扎黑原創
2016-12-20 15:18:441004瀏覽

在上一篇文章《Flex與.NET互通(二):基於WebService的資料存取(上) 》中介紹了透過標籤來存取Webservice。實際上我們也可以透過程式設計的方式動態的存取WebService,Flex SDK為我們提供了WebService類別。

使用WebService類別來存取WebService其實也就是將標籤的屬性透過類別物件的屬性形式來表示,相較之下使用WebService類比使用標籤要靈活。下面我們來看看程式設計方式怎麼連接和呼叫遠端方法:

1 internalfunctiononClick():void
2{
3varservice:WebService=newWebService();
4service.loadWSDL("http://localhost:1146/FlashFlexService.asmx?wsdl" );
5service.addEventListener(ResultEvent.RESULT,onResult);
6service.addEventListener(FaultEvent.FAULT,onFault);
7service.GetBook();
8}

Service直接透過WebSService(WebDLSService) ,動態為類別物件指定相關的處理函數,然後和標籤一樣呼叫遠端WebService方法既可。

1 internalfunctiononResult (evt:ResultEvent):void
2{
3Alert.show(evt.result.Id);
4}
5
6internalfunctiononFault(evt:FaultEvent):void
7{
8885. toString());
9}

如上便完成了使用WebService類別透過程式設計的方式存取遠端WebService方法的呼叫。

下面來看看WebService回傳DataTable等負責類型,在Flex客戶端該怎麼解析。先定義WebService方法如下:

1[WebMethod(Description="此方法將傳回DataTable類型的資料")]
2publicDataTableGetDataTable()
3{
4DataTabledt=newDataTable("Books");
5dt.Columns.Add("Id", typeof(int));
6dt.Columns.Add("Name",typeof(string));
7dt.Columns.Add("Author",typeof(string));
8dt.Columns.Add("Price" ,typeof(double));
9
10DataRowdr=dt.NewRow();
11dr["Id"]=1;
12dr["Name"]="《Flex遊戲開發》";
13dr["Author" ]="張三";
14dr["Price"]=54.85;
15dt.Rows.Add(dr);
16
17dr=dt.NewRow();
18dr["Id"]=2;
19drdr ["Name"]="《Flash遊戲開發》";
20dr["Author"]="李四";
21dr["Price"]=65.50;
22dt.Rows.Add(dr);
23
24returndt;
25}

同樣在Flex客戶端透過WebService來存取就可以了,下面是使用標籤存取(這裡需要注意,標籤的name必須與服務端的WebService方法同名):

12wsdl="http://localhost:1146/DataWebService.asmx?wsdl"useProxy="false">
3
4operation>
5

提供好了WebService,客戶端也連接上了WebService,現在只差呼叫WebService提供的遠端方法了。如下:

1 internalfunctiononTable():void
2{
3myService.addEventListener(ResultEvent.RESULT,onSuccess);
4myService.addEventListener(FaultEvent.FAULT,onFault);
5myService.addEventListener(FaultEvent.FAULT,onFault);
5myService.addEventListener(FaultEvent.FAULT,onFault);
5myService.addEventListener(FaultEvent.FAULT,onFault);
5myService.addEventListener(FaultEvent.FAULT,onFault);
5myService.addEventListener(FaultEvent.FAULT,onFault);
5myService.addEventListener(FaultEvent.FAULT,onFault);
5myService。 evt:ResultEvent):void
9{
10//bookGrid.dataProvider=this.myService.GetDataTable.lastResult.Tables.Books.Rows;
11}
12
13internalfunctiononFault(evt:Fault}
12

13internalfunctiononFault(evt:Fault) .show("呼叫WebService方法失敗,詳細:"+evt.fault.faultDetail.toString());

16

17}🎜🎜將WebService的回傳值綁定在Flex的DataGrid元件,mxml的相關程式碼如下: 🎜

1
23dataProvider="{this.myService.GetDataTable.lastResult.Tables.Books.Rows}">
4
5
6
7
8
9

10
11
12
13 mx:ControlBar>
14

透過DataGrid的dataProvider屬性綁定DataGrid元件的資料來源,除了直接透過"{}"綁定表達式來設定外我們也可以在呼叫遠端方法成功的處理函數裡為DataGrid指定資料來源,請參閱上面程式碼中註解的程式碼部分。 {this.myService.GetDataTable.lastResult.Tables.Books.Rows}表示將遠端WebService方法GetDataTable()的傳回結果(DataTable)的所有行作為資料來源與DataGrid元件進綁定,其中Books為資料來源DataTable的name ,

DataSet,DataTable相比泛型集合來說,性能上有很大的差距,複雜的序列化和反序列化過程也很負責,自從.net 2.0推出泛型到現在,我一直就比較喜歡用泛型來傳遞大數據。 OK,以下我將介紹下在Flex中怎麼去處理WebService方法回傳的泛型集合資料。我們有以下WebService方法定義:

1 [WebMethod(Description="此方法傳回泛型集合")]
2publicListBookList()
3{
4returnnewList
5{
6newBook
7{
8Id=1,
9Name="《Flex遊戲開發》",
10Author="張三",
11Price=54.85
12},
13newBook
14{
15Id=1,
16Name="《Flash16Name="《Flash17》 ="李四",
18Price=65.50
19}
20};
21}

相比DataSet,DataTable類型,使用List返回資料我個人認為更方面容易處理。

這就是以泛型結合(List)的形式回傳的資料形式,相比DataTable的回傳結果更為簡潔,明了。話說到此,我們在Flex下該怎麼去取得這個回傳值和處理這個值呢?其實這裡已經很清楚的展現了我們可以透過什麼方式去處理,仔細看上圖會發現"ArrayOfBook"? ? ? ?這是什麼東西?莫非是在客戶端可以透過數組的形式得到這個回傳值。為了進一步搞清楚這裡面的點點滴滴,我們需要深入到內部去了解下返回值的具體構造,透過Flex Builder的調試環境可以得到如下資訊:

看清楚了嗎? BookList方法的lastResult結構集下有兩個對象,點開節點可知正是我們透過List傳回的兩個Book對象,而lastResult的類型是:mx.collections.ArrayCollection,這不真是ActionScript中的陣列集合嗎?好的,既然這樣,在Flex客戶端便可以直接透過lastResult得到WebService傳回的泛型集合資料了。如下程式碼區塊:

1
2
3
4
5
6
7
8

9
10
11
12

13

關於WebService的資料存取就介紹到這裡,由於個人能力有限,文中有不足之處還望大家指正。如果有什麼好的建議也可以提出,大家互相討論,學習,共同進步! !


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn