Flex与ASP.NET通过Remoting方式交互基本思路
系统基于Flex的表现层与基于ASP.NET的业务逻辑层之间的通信方式主要采用Remote Object,即采用Adobe定义的AMF通信协议,通过使用第三方协议通信网关解析软件Fluorine作为中间件实现Flex与ASP.NET之间的通信。本文将使用FluorineFx网关来提供数据服务等多项功能来介绍通过FluorineFx实现远程访问的相关知识点。 FluorineFx提供的远程访问包括有很多方面的知识点,本文主要介绍其中的三个知识点:访问远程对象返回对象,返回DataTable,返回DataSet对象(返回的对象需要能够在服务器端和flex端都可以被解析,如果在服务器端返回一个复杂的对象那么在flex端就需做相应复杂的对象解析工作)。
一、 在实现访问前建立好远程对象:
namespace Fluorine.ServiceLibrary { public class Disaster { public int Id { get; set; } public string Name { get; set; } } }
二、返回Flex访问的远程对象:
namespace Fluorine.ServiceLibrary { [RemotingService] public class FluorineService { /// <summary> /// 返回一个简单对象 /// </summary> /// <returns></returns> public Disaster GetDisaster() { return new Disaster { Id = 1, Name = "滑坡", }; } /// <summary> /// 返回DataTable对象 /// </summary> /// <returns></returns> [DataTableType("Fluorine.ServiceLibrary.Disaster")] public DataTable GetDataTable() { DataTable dt = new DataTable("Disaster"); dt.Columns.Add("Id", typeof(int)); dt.Columns.Add("Name", typeof(string)); DataRow dr = dt.NewRow(); dr["Id"] = 1; dr["Name"] = "滑坡"; dr = dt.NewRow(); dr["Id"] = 2; dr["Name"] = "崩塌"; return dt; } /// <summary> /// 返回DataSet对象 /// </summary> /// <returns></returns> [DataSetType("Fluorine.ServiceLibrary.Disaster ")] public DataSet GetDataSet() { DataSet ds = new DataSet("DS"); DataTable dt = ds.Tables.Add("Disasters"); dt.Columns.Add("Id", typeof(int)); dt.Columns.Add("Name", typeof(string)); DataRow dr = dt.NewRow(); dr["Id"] = 1; dr["Name"] = "滑坡"; dt.Rows.Add(dr); dr = dt.NewRow(); dr["Id"] = 2; dr["Name"] = "崩塌"; dt.Rows.Add(dr); return ds; } } }
三、 上面代码片段中分别提供了返回一个对象,DataTable以及DataSet对象的方法。这里只需要记住两个关键标识就行,它门是:DataTableType和DataSetType. 下面通过Flex的非可视化组件<mx:RemoteObject>来访问远程对象,具体怎么来调用如下所示。
<mx:RemoteObject id="ro" destination="fluorine" > source="Fluorine.ServiceLibrary.FluorineService" fault="onFaultHandler(event)" <mx:method name="GetDisaster" result="onGetDisasterHandler(event)"/> <mx:method name="GetDataTable" result="onGetDataTableHandler(event)"/> <mx:method name="GetDataSet" result="onGetDataSetHandler(event)"/> </mx:RemoteObject>
(1)、返回对象示例
private var disaster:DisasterVO; private function onGetDisasterHandler(evt:ResultEvent):void { disaster =evt.result as DisasterVO; }
通过点击按扭调用远程方法GetDisaster()完成方法的调用,直接可以将返回结果绑定到界面元素上。
<mx:Button label="Disaster" click="ro.GetDisaster()"/> <mx:TextInput width="302" text="{ disaster.Name+ disaster.ID }"/>
(2)、返回DataTable对象
返回DataTable和DataSet,将结果绑定到DataGrid上显示,先看看DataGrid的定义:
<mx:DataGrid x="10" y="10" width="543" height="147" dataProvider="{books}"> <mx:columns> <mx:DataGridColumn headerText="编号" dataField="Id"/> <mx:DataGridColumn headerText="名称" dataField="Name"/> </mx:columns> </mx:DataGrid>
DataGrid的数据源为定义的一个ArrayCollection对象,详细如下:
[Binable] private var disasters:ArrayCollection; private function onGetDataTableHandler(evt:ResultEvent):void { disasters=evt.result as ArrayCollection; }
(3)、返回DataTable对象
private function onGetDataSetHandler(evt:ResultEvent):void { disasters =evt.result as ArrayCollection; }
如上便完成了通过FluorineFx网关来实现远程访问,下面是完整的Flex端代码:
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> <mx:Script> <![CDATA[ import mx.controls.Alert; import mx.rpc.events.ResultEvent; import mx.rpc.events.FaultEvent; import mx.collections.ArrayCollection; [Binable] private var disasters:ArrayCollection; [Binable] private var disaster:DisasterVO; private function onGetDisasterHandler(evt:ResultEvent):void { disaster =evt.result as DisasterVO; } private function onGetDataTableHandler(evt:ResultEvent):void { disasters=evt.result as ArrayCollection; } private function onGetDataSetHandler(evt:ResultEvent):void { disasters=evt.result as ArrayCollection; } private function onFaultHandler(evt:FaultEvent):void { Alert.show(evt.fault.faultDetail); } ]]> </mx:Script> <mx:Panel x="42" y="56" width="578" height="226" layout="absolute" fontSize="12"> <mx:DataGrid x="10" y="10" width="543" height="147" dataProvider="{disasters}"> <mx:columns> <mx:DataGridColumn headerText="编号" dataField="Id"/> <mx:DataGridColumn headerText="名称" dataField="Name"/> </mx:columns> </mx:DataGrid> <mx:ControlBar> <mx:Button label="DataTable" click="getDataTable()"/> <mx:Button label="DataSet" click="getDataSet()"/> <mx:Button label="Disaster" click="ro.GetDisaster()"/> <mx:TextInput width="302" text="{ disaster.Name+ disaster.ID }"/> </mx:ControlBar> </mx:Panel> <mx:RemoteObject id="ro" destination="fluorine" > source="Fluorine.ServiceLibrary.FluorineService" fault="onFaultHandler(event)" <mx:method name="GetDisaster " result="onGetDisasterHandler(event)"/> <mx:method name="GetDataTable" result="onGetDataTableHandler(event)"/> <mx:method name="GetDataSet" result="onGetDataSetHandler(event)"/> </mx:RemoteObject> </mx:Application>