日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > asp.net >内容正文

asp.net

Flex与.NET互操作(十四):FluorineFx的AMF协议通信

發(fā)布時(shí)間:2024/9/20 asp.net 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Flex与.NET互操作(十四):FluorineFx的AMF协议通信 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

AMF(Action Message Format)在開發(fā)Flash/Flex應(yīng)用中使用頻率是非常高的,相對(duì)普通的HTTP、WebService的SOAP等多種數(shù)據(jù)通信方式的效率更高,有人曾經(jīng)做過(guò)這方面的測(cè)試,詳細(xì)可以訪問(wèn):http://xinsync.xju.edu.cn/index.php/archives/2162。本文將結(jié)合FluorineFx來(lái)提供通信服務(wù)接口,在客戶端通過(guò)Flex來(lái)訪問(wèn),簡(jiǎn)單的介紹下關(guān)于使用FluorineFx的AMF(Action Message Format)協(xié)議通信的用法。

??????首先建立一個(gè)FluorineFx服務(wù)庫(kù),并建立一個(gè)數(shù)據(jù)傳輸對(duì)象(DTO),為該對(duì)象添加[FluorineFx.TransferObject]表示該對(duì)象可以用作于FluorineFx的數(shù)據(jù)傳輸對(duì)象,這個(gè)對(duì)象將會(huì)在本文后面用到,如下代碼塊:

namespace?FxDotNet.Services.DTO
{
????[FluorineFx.TransferObject]public?class?Book
????{public?int?ID?{?get;?set;?}public?string?Name?{?get;?set;?}public?string?Author?{?get;?set;?}public?double?Price?{?get;?set;?}public?Book()
????????{?}public?Book(int?id,?string?name,?string?author,?double?price)
????????{this.ID?=?id;this.Name?=?name;this.Author?=?author;this.Price?=?price;
????????}
????}
}

??????接下來(lái)就需要提供一個(gè)FluorineFx的遠(yuǎn)程服務(wù)(即標(biāo)記有[RemotingService]的對(duì)象),通過(guò)該服務(wù)提供對(duì)外訪問(wèn)的方法接口,如下代碼塊:

namespace?FxDotNet.Services
{
????[RemotingService]public?class?DataServices
????{public?DataServices()
????????{
????????}///<summary>///獲取服務(wù)端的系統(tǒng)時(shí)間///</summary>///<returns></returns>public?string?GetServerTime()
????????{return?DateTime.Now.ToString();
????????}public?ArrayCollection?GetBooks()
????????{
????????????ArrayCollection?array?=?new?ArrayCollection();
????????????array.Add(new?Book(1,?"三國(guó)演義",?"羅貫中",?100.00));
????????????array.Add(new?Book(2,?"西游記",?"吳承恩",?200.00));
????????????array.Add(new?Book(3,?"水滸傳",?"施耐庵",?300.00));
????????????array.Add(new?Book(4,?"紅樓夢(mèng)",?"曹雪芹",?400.00));return?array;
????????}
????}
}


??????通過(guò)FluorineFx網(wǎng)站來(lái)宿主該遠(yuǎn)程服務(wù),通過(guò)Flex的配置文件services-config.xml配置遠(yuǎn)程訪問(wèn)的AMF連接通道。

<channels><channel-definition?id="my-amf"class="mx.messaging.channels.AMFChannel"><endpoint?uri="http://{server.name}:{server.port}/{context.root}/Gateway.aspx"class="flex.messaging.endpoints.AMFEndpoint"/><properties></properties></channel-definition></channels>

???????FluorineFx提供的遠(yuǎn)程服務(wù)(RemotingService),使用Flex、Flash或Silverlight開發(fā)的客戶端都是可以訪問(wèn)的,要實(shí)現(xiàn)客戶端的遠(yuǎn)程調(diào)用其實(shí)是很簡(jiǎn)單的,這里以Flex作為示例進(jìn)行演示,設(shè)置通信協(xié)議為AMF3,然后直接調(diào)用當(dāng)前連接到服務(wù)器端連接對(duì)象的call()方法就可以實(shí)現(xiàn)遠(yuǎn)程調(diào)用,詳細(xì)請(qǐng)查看下面完整的Flex示例。

<?xml?version="1.0"?encoding="utf-8"?>
<mx:Application?xmlns:mx="http://www.adobe.com/2006/mxml"?layout="absolute"?creationComplete="init()"?fontSize="12">
????<mx:Script>
????????<![CDATA[
????????????import?mx.collections.ArrayCollection;
????????????import?mx.controls.List;
????????????import?mx.rpc.events.FaultEvent;
????????????import?mx.rpc.events.ResultEvent;private?var?nc:NetConnection;private?var?rs:Responder;private?function?init():void
????????????{
????????????????nc?=?new?NetConnection();
????????????????rs?=?new?Responder(onResult,onStatus);
????????????????nc.objectEncoding?=?ObjectEncoding.AMF3;
????????????????nc.connect("http://localhost:2311/FxDotNet.Web/Gateway.aspx");
????????????????nc.client?=?this;
????????????}private?function?onResult(result:String):void
????????????{this.lbServerTime.text?=?"服務(wù)端系統(tǒng)時(shí)間為:"?+?result;
????????????}private?function?onStatus(event:Object):void
????????????{
????????????????trace("Error");
????????????}private?function?getServerTime(event:MouseEvent):void
????????????{//服務(wù)器端所提供的RemotingService的全限定名nc.call("FxDotNet.Services.DataServices.GetServerTime",rs);
????????????}????????
????????]]>
????</mx:Script>
????<mx:Button?x="19"?y="28"?label="獲取服務(wù)器系統(tǒng)時(shí)間"?click="getServerTime(event)"/>
????<mx:Label?x="19"?y="60"?width="402"?id="lbServerTime"/>
</mx:Application>

??????同樣可以使用AMF來(lái)做大數(shù)據(jù)的傳輸,比如要傳遞一個(gè)集合、數(shù)組、DataTable或是DataSet等,下面以集合做為示例演示,ActionScript 3.0中新增了ArrayCollectin類,FluorineFx在服務(wù)器端對(duì)ActionScript 3.0的ArrayCollection對(duì)進(jìn)行了序列化映射封裝,服務(wù)端FluorineFx.AMF3.ArrayCollection類型的對(duì)象可以直接被客戶端的ArrayCollection所接收。

??????如上面FluorineFx所提供的遠(yuǎn)程服務(wù)接口中的GetBooks()方法,Flex調(diào)用此方法就會(huì)得到一個(gè)ArrayCollection對(duì)象,通過(guò)調(diào)試跟蹤返回的數(shù)據(jù)可以很清楚的分析這些數(shù)據(jù),如下圖示:

??????????????????

??????詳細(xì)請(qǐng)看下面的Flex完整示例代碼:

<?xml?version="1.0"?encoding="utf-8"?>
<mx:Application?xmlns:mx="http://www.adobe.com/2006/mxml"?layout="absolute"?fontSize="12"?
????width="541"?height="302"?creationComplete="init()">
????<mx:Script>
????????<![CDATA[
????????????import?mx.collections.ArrayCollection;
????????????import?mx.controls.List;
????????????import?mx.rpc.events.FaultEvent;
????????????import?mx.rpc.events.ResultEvent;private?var?nc:NetConnection;private?var?rs:Responder;private?function?init():void
????????????{
????????????????nc?=?new?NetConnection();
????????????????rs?=?new?Responder(onResult,onFault);
????????????????nc.objectEncoding?=?ObjectEncoding.AMF3;
????????????????nc.connect("http://localhost:2311/FxDotNet.Web/Gateway.aspx");
????????????????nc.client?=?this;
????????????}private?function?getBook(event:MouseEvent):void
????????????{
????????????????nc.call("FxDotNet.Services.DataServices.GetBooks",rs);
????????????}private?function?onResult(result:ArrayCollection):void
????????????{this.bookGrid.dataProvider?=?result;
????????????}private?function?onFault(event:Object):void
????????????{
????????????????trace("Error");
????????????}
????????]]>
????</mx:Script>
????<mx:Button?x="44"?y="46"?label="獲取圖書信息"?click="getBook(event)"/>
?????<mx:DataGrid?x="44"?y="78"?id="bookGrid">
??????????<mx:columns>
??????????????<mx:DataGridColumn?headerText="編號(hào)"?dataField="ID"/>
??????????????<mx:DataGridColumn?headerText="書名"?dataField="Name"/>
??????????????<mx:DataGridColumn?headerText="作者"?dataField="Author"/>
??????????????<mx:DataGridColumn?headerText="價(jià)格"?dataField="Price"/>
??????????</mx:columns>
??????</mx:DataGrid>
</mx:Application>

??????除了使用FluorineFx所提供的ArrayCollection外,同樣可以使用我們熟悉的Object[],List<Object>,DataTable等常用類型來(lái)作為數(shù)據(jù)返回的類型,其中Object[]和List<Object>類型的數(shù)據(jù)返回到客戶段能夠直接被客戶端所接收,如下使用Object[]作數(shù)據(jù)返回類型的代碼塊:

/*************服務(wù)端方法*************/public?Book[]?GetBookArray()
{
????Book[]?book?=?new?Book[]
????{new?Book(1,?"三國(guó)演義",?"羅貫中",?100.00),new?Book(2,?"西游記",?"吳承恩",?200.00),new?Book(3,?"水滸傳",?"施耐庵",?300.00),new?Book(4,?"紅樓夢(mèng)",?"曹雪芹",?400.00)
????};return?book;
}/*************客戶端方法*************/private?function?onResult(result:Array):void
{//}

??????下面是以List<Object>類型返回的代碼示例代碼,客戶段可以使用ArrayCollection直接接收:

/*************服務(wù)端方法*************////<summary>///以泛型類型返回給客戶端///</summary>///<returns></returns>public?List<Book>?GetBookList()
{
????List<Book>?list?=?new?List<Book>
????{new?Book(1,?"三國(guó)演義",?"羅貫中",?100.00),new?Book(2,?"西游記",?"吳承恩",?200.00),new?Book(3,?"水滸傳",?"施耐庵",?300.00),new?Book(4,?"紅樓夢(mèng)",?"曹雪芹",?400.00)
????};return?list;
}/*************客戶端方法*************/private?function?onResult(result:ArrayCollection):void
{//}

??????如果要使用DataTable類型做方法的數(shù)據(jù)返回類型就需要注意下,服務(wù)器端直接返回DataTable類型的數(shù)據(jù)客戶端是不能直接接收解析的,要使客戶斷方便解析所返回的DataTable類型數(shù)據(jù),FluorineFx提供了DataTableTypeAttribute,為返回DataTable類型的方法加上DataTableTypeAttribute后返回給客戶端,客戶端就可以直接使用ArrayCollection接收了。

/******************服務(wù)端方法***********************/
[DataTableType("Book",?"FxDotNet.Services.DTO.Book")]public?DataTable?GetBookTable()
{
?????DataTable?dt?=?new?DataTable("Book");
?????dt.Columns.Add("ID",?typeof(int));
?????dt.Columns.Add("Name",?typeof(string));
?????dt.Columns.Add("Author",?typeof(string));
?????dt.Columns.Add("Price",?typeof(double));
?????DataRow?dr?=?dt.NewRow();
?????dr["ID"]?=?1;
?????dr["Name"]?=?"《三國(guó)演義》";
?????dr["Author"]?=?"羅貫中";
?????dr["Price"]?=?100.00;
?????dt.Rows.Add(dr);
?????dr?=?dt.NewRow();
?????dr["ID"]?=?2;
?????dr["Name"]?=?"《西游記》";
?????dr["Author"]?=?"吳承恩";
?????dr["Price"]?=?200.00;
?????dt.Rows.Add(dr);
?????dr?=?dt.NewRow();
?????dr["ID"]?=?3;
?????dr["Name"]?=?"《水滸傳》";
?????dr["Author"]?=?"施耐庵";
?????dr["Price"]?=?300.00;
?????dt.Rows.Add(dr);
?????dr?=?dt.NewRow();
?????dr["ID"]?=?4;
?????dr["Name"]?=?"《紅樓夢(mèng)》";
?????dr["Author"]?=?"曹雪芹";
?????dr["Price"]?=?400.00;
?????dt.Rows.Add(dr);return?dt;
}/******************客戶端方法***********************/private?function?onResult(result:ArrayCollection):void
{//do?other}

????????????

??????關(guān)于FluorineFx的AMF就簡(jiǎn)單介紹這些,要想了解更多的Flex客戶端與.NET服務(wù)器端通信,可以訪問(wèn)?這里?。?

??????本文示例代碼下載?FluorineFxAMF.rar

總結(jié)

以上是生活随笔為你收集整理的Flex与.NET互操作(十四):FluorineFx的AMF协议通信的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。