一. 相关说明:

    本篇将呈现完整的Flash Remoting访问远程服务器,包括以可视化组件方式和以编程方式访问远程服务器。Asp.net服务器端和Flex客户端完整代码下载。

二. 相关代码预览:

    1.frServices.as,以编程方式访问远程服务器。
  1. package com.demo.fr
  2. {
  3.     import flash.events.EventDispatcher;
  4.     import flash.net.NetConnection;
  5.     import flash.net.Responder;
  6.    
  7.     //用代码调用flash Remoting。
  8.     public class frServices
  9.     {
  10.         //Remoting服务器对象完整名称。
  11.         private var name_ServerClass : String = "Hxw.Demo.FlashRemoting.Hellow";
  12.         //初始化一个事件广播对象。
  13.         private var eventDispatcher : EventDispatcher = new EventDispatcher();       
  14.         //事件关键字定义:Event_KEY_Success_DisplayHellow。
  15.         public static var Event_KEY_Success_DisplayHellow : String = "Event_KEY_Success_DisplayHellow";
  16.         //事件关键字定义:Event_KEY_Success_SayHellowWorld。
  17.         public static var Event_KEY_Success_SayHellowWorld : String = "Event_KEY_Success_SayHellowWorld";
  18.         //事件关键字定义:Event_KEY_Success_GetUsers。
  19.         public static var Event_KEY_Success_GetUsers : String = "Event_KEY_Success_GetUsers";       
  20.         //事件关键字定义:Event_KEY_Fault。
  21.         public static var Event_KEY_Fault : String = "Event_KEY_Fault";           
  22.         //Remoting连接对象。
  23.         private var conn : NetConnection = null;
  24.         //Flash Remoting方法返回值获取对象。
  25.         private var rp :Responder = null;
  26.        
  27.         //构造器。
  28.         public function frServices()
  29.         {
  30.            
  31.         }
  32.        
  33.         //开始调用远程服务方法。
  34.         public function preCall(result : Function):void
  35.         {           
  36.             //初始化Remoting连接对象。
  37.             this.conn = new NetConnection();           
  38.             //调用connect( )方法,传递进Flash Remoting网关的URL。
  39.             this.conn.connect("http://localhost:5678/WebFR/Gateway.aspx");           

  40.             this.rp = new Responder(result,onError);   
  41.         }
  42.        
  43.         //调用远程服务方法。
  44.         public function call_DisplayHellow():void
  45.         {               
  46.             this.preCall(onResult_DisplayHellow);
  47.            
  48.             //对象的call( )方法调用Flash Remoting方法,call( )方法需要两个参数,
  49.             //第一个参数指定方法名称和路径,第二个参数指定响应处理函数,如果不需要处理函数,可直接设为null
  50.             //处理FlashRemoting响应。
  51.             this.conn.call(this.name_ServerClass + ".DisplayHellow",this.rp);
  52.         }
  53.        
  54.         //调用远程服务方法。
  55.         public function call_SayHellowWorld(name : String):void
  56.         {
  57.             this.preCall(onResult_SayHellowWorld);
  58.             this.conn.call(this.name_ServerClass + ".SayHellowWorld",this.rp,name);
  59.         }
  60.        
  61.         //调用远程服务方法。
  62.         public function call_GetUsers():void
  63.         {
  64.             this.preCall(onResult_GetUsers);
  65.             this.conn.call(this.name_ServerClass + ".GetUsers",this.rp);
  66.         }       
  67.        
  68.         //调用服务成功。
  69.         private function onResult_DisplayHellow(result : Object) : void
  70.         {
  71.             this.resultHandler(result,"DisplayHellow",frServices.Event_KEY_Success_DisplayHellow);
  72.         }
  73.        
  74.         private function onResult_SayHellowWorld(result : Object) : void
  75.         {
  76.             this.resultHandler(result,"SayHellowWorld",frServices.Event_KEY_Success_SayHellowWorld);
  77.         }
  78.        
  79.         private function onResult_GetUsers(result : Object) : void
  80.         {
  81.             this.resultHandler(result,"GetUsers",frServices.Event_KEY_Success_GetUsers);
  82.         }       
  83.        
  84.         //调用服务成功的处理。
  85.         private function resultHandler(result : Object,targetName : String ,eventKey : String) : void
  86.         {
  87.             var ce : CUEvent = new CUEvent(eventKey);
  88.             ce.Sender = result;
  89.             ce.CurrentTargetName = targetName;
  90.            
  91.             this.eventDispatcher.dispatchEvent(ce);
  92.         }
  93.        
  94.         //调用服务失败。
  95.         private function onError(error : Object):void
  96.         {
  97.             var ce : CUEvent = new CUEvent(Event_KEY_Fault);
  98.             ce.Sender = error;
  99.            
  100.             this.eventDispatcher.dispatchEvent(ce);   
  101.         }
  102.        
  103.         //创建一个供外部调用的附加事件侦听的方法。
  104.         public function addEventListener(type : String , listener : Function):void
  105.         {
  106.             this.eventDispatcher.addEventListener(type,listener);   
  107.         }

  108.     }
  109. }
复制代码
2.CUEvent.as,自定义事件。
  1. package com.demo.fr
  2. {
  3.     import flash.events.Event;
  4.    
  5.     //从Event继承一个类。
  6.     //为什么as3中仅仅能够定义一个构造器,郁闷。
  7.     public class CUEvent extends Event
  8.     {
  9.         //数据实体。
  10.         private var _sender : Object = null;
  11.         //方法名。
  12.         private var  _currentTargetName: String = "";
  13.        
  14.         //构造器(为什么as3中仅仅能够定义一个构造器,郁闷)。
  15.         public function CUEvent(type : String,bubbles : Boolean = false,cancelable : Boolean = false)
  16.         {
  17.             super(type,bubbles,cancelable);
  18.         }   
  19.        
  20.         //获取 数据实体。
  21.         public function get Sender():Object
  22.         {
  23.             return this._sender;
  24.         }

  25.         //设置 数据实体。
  26.         public function set Sender(value : Object) : void
  27.         {
  28.             this._sender = value;
  29.         }
  30.        
  31.         //获取 方法名称。
  32.         public function get CurrentTargetName() : String
  33.         {
  34.             return this._currentTargetName;
  35.         }
  36.        
  37.         //设置 方法名称。
  38.         public function set CurrentTargetName(value : String) :void
  39.         {
  40.             this._currentTargetName = value;
  41.         }

  42.     }
  43. }
复制代码
3.User.as,数据模型,对应服务器端的User.cs。
  1. package com.demo.fr
  2. {
  3.     [RemoteClass(alias="Hxw.Demo.FlashRemoting.User")]
  4.     public class User
  5.     {
  6.         public function User()
  7.         {
  8.         }
  9.        
  10.         private var _name : String = "";
  11.         private var _age : int = 0;
  12.         private var _sex : String = "";
  13.        
  14.         public function get Name():String
  15.         {
  16.             return this._name;
  17.         }
  18.        
  19.         public function set Name(v:String):void
  20.         {
  21.             this._name = v;
  22.         }
  23.        
  24.         public function get Age():int
  25.         {
  26.             return this._age;
  27.         }
  28.        
  29.         public function set Age(v:int):void
  30.         {
  31.             this._age = v;
  32.         }
  33.        
  34.         public function get Sex():String
  35.         {
  36.             return this._sex;
  37.         }
  38.        
  39.         public function set Sex(v:String):void
  40.         {
  41.             this._sex = v;
  42.         }
  43.        
  44.         public function toString():String
  45.         {
  46.             return "姓名:" + this._name + ";年龄:" + this._age.toString() + ";性别:" + this._sex;
  47.         }
  48.     }
  49. }
复制代码
4.MXML Application代码。
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">

  3.     <mx:Script>
  4.         <![CDATA[
  5.             import com.demo.fr.CUEvent;
  6.             import flash.net.navigateToURL;
  7.             import mx.collections.ArrayCollection;           
  8.             import mx.rpc.events.ResultEvent;
  9.             import mx.rpc.events.FaultEvent;
  10.             import mx.controls.Alert;
  11.             import com.demo.fr.User;
  12.             import com.demo.fr.frServices;
  13.             import mx.styles.StyleManager;
  14.            
  15.            
  16.             //1表示以可视化组件方式访问过程服务器。
  17.               //2表示以编程方式访问过程服务器。
  18.             private var mode : int = 2;
  19.            
  20.             //调用相关的Remoting服务或模式。
  21.             private function callServer(fn : String):void
  22.             {               
  23.                 if(this.mode == 1)
  24.                 {
  25.                     switch(fn)
  26.                     {
  27.                         case "DisplayHellow":
  28.                             sampleRemoteObject.DisplayHellow();
  29.                             break;
  30.                         case "SayHellowWorld":
  31.                             sampleRemoteObject.SayHellowWorld(this.txtMessage.text);
  32.                             break;                       
  33.                         case "GetUsers":
  34.                             sampleRemoteObject.GetUsers();
  35.                             break;
  36.                     }
  37.                 }
  38.                 else
  39.                 {
  40.                     var fr : frServices = new frServices();   
  41.                     this.addEventListener(frServices.Event_KEY_Fault,onRemoteFault2);
  42.                    
  43.                     switch(fn)
  44.                     {
  45.                         case "DisplayHellow":
  46.                             fr.addEventListener(frServices.Event_KEY_Success_DisplayHellow,onRemoteResult2);
  47.                             fr.call_DisplayHellow();
  48.                             break;
  49.                         case "SayHellowWorld":
  50.                             fr.addEventListener(frServices.Event_KEY_Success_SayHellowWorld,onRemoteResult2);
  51.                             fr.call_SayHellowWorld(this.txtMessage.text);
  52.                             break;                       
  53.                         case "GetUsers":
  54.                             fr.addEventListener(frServices.Event_KEY_Success_GetUsers,onRemoteResult2);
  55.                             fr.call_GetUsers();
  56.                             break;
  57.                     }
  58.                 }
  59.             }
  60.            
  61.            
  62.             //当Remoting服务调用成功的回调函数(控件调用)。
  63.             private function onRemoteResult(event:ResultEvent) : void
  64.             {
  65.                 this.remoteSuccessHandler(event.result,event.currentTarget.name);               
  66.             }
  67.            
  68.             //当Remoting服务调用失败的回调函数(控件调用)。
  69.             private function onRemoteFault(event:FaultEvent) : void
  70.             {
  71.                 this.remoteFault(event.fault.toString());
  72.             }       
  73.            
  74.             //当Remoting服务调用成功的回调函数(代码实现)。
  75.             private function onRemoteResult2(event : CUEvent):void
  76.             {
  77.                 this.remoteSuccessHandler(event.Sender,event.CurrentTargetName);
  78.             }

  79.             //当Remoting服务调用失败的回调函数(代码实现)。
  80.             private function onRemoteFault2(event : CUEvent) : void
  81.             {
  82.                 this.remoteFault(event.Sender.toString());
  83.             }       
  84.            
  85.             //当Remoting服务调用成功的处理。
  86.             private function remoteSuccessHandler(data : Object,fn : String):void
  87.             {
  88.                 switch(fn)
  89.                 {
  90.                     case "DisplayHellow":
  91.                         Alert.show(data as String,"DisplayHellow");
  92.                         break;
  93.                     case "SayHellowWorld":
  94.                         Alert.show(data as String,"SayHellowWorld");
  95.                         break;
  96.                     case "GetUsers":
  97.                         var userList : ArrayCollection = data as ArrayCollection;
  98.                         this.dgUsers.dataProvider = userList;
  99.                         break;
  100.                 }
  101.             }
  102.            
  103.             //当Remoting服务调用失败的处理。
  104.             private function remoteFault(desc:String):void
  105.             {
  106.                 Alert.show(desc,"Remoting调用出错");
  107.             }           

  108.            
  109.             //清空DataGrid中的数据。
  110.             private function clearUsers() : void
  111.             {
  112.                 this.dgUsers.dataProvider = null;
  113.             }
  114.            
  115.             //链接到本人的博客。
  116.             private function getURL():void
  117.             {
  118.                 flash.net.navigateToURL(new URLRequest("http://mrhgw.cnblogs.com"));
  119.             }   
  120.            
  121.         ]]>
  122.     </mx:Script>   
  123.    
  124.     <mx:RemoteObject id="sampleRemoteObject"
  125.         destination="fluorine"
  126.         source="Hxw.Demo.FlashRemoting.Hellow"
  127.         showBusyCursor="true">
  128.        
  129.       <!--这里是.NET中的方法,name = 方法名 -->     
  130.         <mx:method name="DisplayHellow" result="onRemoteResult(event)" fault="onRemoteFault(event)"/>
  131.         <mx:method name="SayHellowWorld" result="onRemoteResult(event)" fault="onRemoteFault(event)"/>
  132.         <mx:method name="GetUsers" result="onRemoteResult(event)" fault="onRemoteFault(event)"/>       
  133.     </mx:RemoteObject>
  134.     <mx:Panel layout="absolute" title="Flash Remoting Demo" fontSize="25" right="19" left="19" bottom="67" top="20">
  135.         <mx:TitleWindow x="28" y="29" width="290" height="116" layout="absolute" title="Display Hellow World" fontSize="15">
  136.             <mx:Button x="10" y="21" label="Call" id="btDisplayHellow" width="120" fontSize="15" click="callServer('DisplayHellow');"/>
  137.         </mx:TitleWindow>
  138.         <mx:TitleWindow layout="absolute" title="Say Hellow World" top="168" bottom="30" left="28" width="290" fontSize="15">
  139.             <mx:TextInput x="10" y="30" width="232" id="txtMessage" fontSize="13"/>
  140.             <mx:Button x="10" y="76" label="Call" id="btSayHellowWorld" width="120" fontSize="15" click="callServer('SayHellowWorld')"/>
  141.             <mx:Label x="10" y="0" text="Name:" fontSize="13" fontWeight="bold"/>
  142.         </mx:TitleWindow>
  143.         <mx:TitleWindow layout="absolute" title="Get Users" left="340" right="34" bottom="30" top="29" fontSize="15">
  144.             <mx:Button x="10" y="21" label="Call" id="btGetUser" width="120" fontSize="15" click="callServer('GetUsers')"/>
  145.             <mx:DataGrid id="dgUsers" fontSize="13" right="10" left="10" top="65" bottom="10">
  146.                 <mx:columns>
  147.                     <mx:DataGridColumn headerText="姓名" dataField="Name"/>
  148.                     <mx:DataGridColumn headerText="性别" dataField="Sex"/>
  149.                     <mx:DataGridColumn headerText="年龄" dataField="Age"/>
  150.                 </mx:columns>
  151.             </mx:DataGrid>
  152.             <mx:Button x="148" y="21" label="Clear" id="btClear" width="120" fontSize="15" click="clearUsers()"/>
  153.         </mx:TitleWindow>
  154.     </mx:Panel>
  155.     <mx:HRule right="10" left="10" bottom="44" height="10"/>
  156.     <mx:LinkButton label="Powered by Hxw([url]http://mrhgw.cnblogs.com[/url])" fontSize="15" fontStyle="italic" right="45" bottom="8" click="getURL();"/>
  157.    
  158. </mx:Application>
复制代码
5. 注意。


        在MXML Application的代码中,有代码:private var mode : int = 2;mode值为1表示以可视化组件方式访问远程服务器;mode值为2表示以编程方式访问远程服务器。

三. 结束语。

    flex 3 + .net开发flash Remoting本系列文章至此结束,如有谬误敬请指正,欢迎一起学习交流。

四. Demo下载。

    ASP.NET服务器端代码及Flex客户端代码下载:
附件: 亲,您没有权限下载或查看附件喔:-) 试试登录注册吧!
TOP

支持下

支持下支持下
TOP

向先进者学习
TOP

回复了没显示产?
TOP

路过,下载
TOP

学习一下哈
TOP

学习学习
TOP

支持一下~
TOP

Very Good
TOP

o_o

o_o_o_o_o_o_o_o
TOP