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

简介:
AMF(Action Message Format)在开发Flash/Flex应用中使用频率是非常高的,相对普通的HTTP、WebService的SOAP等多种数据通信方式的效率更高,有人曾经做过这方面的测试,详细可以访问: http://xinsync.xju.edu.cn/index.php/archives/2162 。本文将结合FluorineFx来提供通信服务接口,在客户端通过Flex来访问,简单的介绍下关于使用FluorineFx的AMF(Action Message Format)协议通信的用法。
      首先建立一个FluorineFx服务库,并建立一个数据传输对象(DTO),为该对象添加 [FluorineFx.TransferObject]表示该对象可以用作于FluorineFx的数据传输对象,这个对象将会在本文后面用到,如下代码块:
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;
        }
    }
}
 
      接下来就需要提供一个FluorineFx的远程服务(即标记有[RemotingService]的对象),通过该服务提供对外访问的方法接口,如下代码块:
namespace  FxDotNet.Services
{
    [RemotingService]
    
public   class  DataServices
    {
        
public  DataServices()
        {
        }

        
///   <summary>
        
///  获取服务端的系统时间
        
///   </summary>
        
///   <returns></returns>
         public   string  GetServerTime()
        {
            
return  DateTime.Now.ToString();
        }

        
public  ArrayCollection GetBooks()
        {
            ArrayCollection array 
=   new  ArrayCollection();
            array.Add(
new  Book( 1 " 三国演义 " " 罗贯中 " 100.00 ));
            array.Add(
new  Book( 2 " 西游记 " " 吴承恩 " 200.00 ));
            array.Add(
new  Book( 3 " 水浒传 " " 施耐庵 " 300.00 ));
            array.Add(
new  Book( 4 " 红楼梦 " " 曹雪芹 " 400.00 ));

            
return  array;
        }
    }
}

      通过FluorineFx网站来宿主该远程服务,通过Flex的配置文件services-config.xml配置远程访问的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提供的远程服务(RemotingService),使用Flex、Flash或Silverlight开发的客户端都是可以访问的,要实现客户端的远程调用其实是很简单的,这里以Flex作为示例进行演示,设置通信协议为AMF3,然后直接调用当前连接到服务器端连接对象的call()方法就可以实现远程调用,详细请查看下面完整的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  =   " 服务端系统时间为: "   +  result;
            }
            
            
private  function onStatus( event :Object): void
            {
                trace(
" Error " );
            }
            
            
private  function getServerTime( event :MouseEvent): void
            {
                
// 服务器端所提供的RemotingService的全限定名
                nc.call( " FxDotNet.Services.DataServices.GetServerTime " ,rs);
            }        
        ]]
>
    
</ mx:Script >
    
< mx:Button x = " 19 "  y = " 28 "  label = " 获取服务器系统时间 "  click = " getServerTime(event) " />
    
< mx:Label x = " 19 "  y = " 60 "  width = " 402 "  id = " lbServerTime " />
</ mx:Application >
 
      同样可以使用AMF来做大数据的传输,比如要传递一个集合、数组、DataTable或是DataSet等,下面以集合做为示例演示,ActionScript 3.0中新增了ArrayCollectin类,FluorineFx在服务器端对ActionScript 3.0的ArrayCollection对进行了序列化映射封装,服务端 FluorineFx.AMF3.ArrayCollection类型的对象可以直接被客户端的ArrayCollection所接收。
      如上面FluorineFx所提供的远程服务接口中的GetBooks()方法,Flex调用此方法就会得到一个ArrayCollection对象,通过调试跟踪返回的数据可以很清楚的分析这些数据,如下图示:
                  
 
      详细请看下面的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 = " 编号 "  dataField = " ID " />
              
< mx:DataGridColumn headerText = " 书名 "  dataField = " Name " />
              
< mx:DataGridColumn headerText = " 作者 "  dataField = " Author " />
              
< mx:DataGridColumn headerText = " 价格 "  dataField = " Price " />
          
</ mx:columns >
      
</ mx:DataGrid >
</ mx:Application >
 
      除了使用FluorineFx所提供的ArrayCollection外,同样可以使用我们熟悉的Object[],List<Object>,DataTable等常用类型来作为数据返回的类型,其中Object[]和List<Object>类型的数据返回到客户段能够直接被客户端所接收,如下使用Object[]作数据返回类型的代码块:
 
/* ************服务端方法************ */
public  Book[] GetBookArray()
{
    Book[] book 
=   new  Book[]
    {
        
new  Book( 1 " 三国演义 " " 罗贯中 " 100.00 ),
        
new  Book( 2 " 西游记 " " 吴承恩 " 200.00 ),
        
new  Book( 3 " 水浒传 " " 施耐庵 " 300.00 ),
        
new  Book( 4 " 红楼梦 " " 曹雪芹 " 400.00 )
    };
    
return  book;
}
/* ************客户端方法************ */
private  function onResult(result:Array): void
{
   
//
}
 
      下面是以List<Object>类型返回的代码示例代码,客户段可以使用ArrayCollection直接接收:
 
/* ************服务端方法************ */
///   <summary>
///  以泛型类型返回给客户端
///   </summary>
///   <returns></returns>
public  List < Book >  GetBookList()
{
    List
< Book >  list  =   new  List < Book >
    {
        
new  Book( 1 " 三国演义 " " 罗贯中 " 100.00 ),
        
new  Book( 2 " 西游记 " " 吴承恩 " 200.00 ),
        
new  Book( 3 " 水浒传 " " 施耐庵 " 300.00 ),
        
new  Book( 4 " 红楼梦 " " 曹雪芹 " 400.00 )
    };
    
return  list;
}
/* ************客户端方法************ */
private  function onResult(result:ArrayCollection): void
{
   
//
}
 
      如果要使用DataTable类型做方法的数据返回类型就需要注意下,服务器端直接返回DataTable类型的数据客户端是不能直接接收解析的,要使客户断方便解析所返回的DataTable类型数据,FluorineFx提供了DataTableTypeAttribute,为返回DataTable类型的方法加上DataTableTypeAttribute后返回给客户端,客户端就可以直接使用ArrayCollection接收了。
 
返回DataTable类型
 
            
      关于FluorineFx的AMF就简单介绍这些,要想了解更多的Flex客户端与.NET服务器端通信,可以访问  这里 。 
      本文示例代码下载  FluorineFxAMF.rar




本文转自 beniao 51CTO博客,原文链接:http://blog.51cto.com/beniao/166131,如需转载请自行联系原作者

目录
相关文章
|
27天前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
86 3
|
1月前
使用的是.NET Framework 4.0,并且需要使用SMTP协议发送电子邮件
使用的是.NET Framework 4.0,并且需要使用SMTP协议发送电子邮件
39 1
|
10天前
|
消息中间件 Linux iOS开发
.NET 高性能异步套接字库,支持多协议、跨平台、高并发
【11月更文挑战第3天】本文介绍了高性能异步套接字库在网络编程中的重要性,特别是在处理大量并发连接的应用中。重点讨论了 .NET 中的 Socket.IO 和 SuperSocket 两个库,它们分别在多协议支持、跨平台特性和高并发处理方面表现出色。Socket.IO 基于 WebSocket 协议,支持多种通信协议和跨平台运行,适用于实时通信应用。SuperSocket 则通过事件驱动的异步编程模型,实现了高效的高并发处理,适用于需要自定义协议的场景。这些库各有特点,可根据具体需求选择合适的库。
|
监控 物联网 API
【.NET+MQTT】.NET6 环境下实现MQTT通信,以及服务端、客户端的双边消息订阅与发布的代码演示
MQTT广泛应用于工业物联网、智能家居、各类智能制造或各类自动化场景等。MQTT是一个基于客户端-服务器的消息发布/订阅传输协议,在很多受限的环境下,比如说机器与机器通信、机器与物联网通信等。好了,科普的废话不多说,下面直接通过.NET环境来实现一套MQTT通信demo,实现服务端与客户端的双边消息发布与订阅的功能和演示。
1270 0
【.NET+MQTT】.NET6 环境下实现MQTT通信,以及服务端、客户端的双边消息订阅与发布的代码演示
|
4月前
|
存储 开发框架 前端开发
基于Lumisoft.NET组件,使用IMAP协议收取邮件
基于Lumisoft.NET组件,使用IMAP协议收取邮件
|
3月前
|
开发框架 .NET API
.Net Core Console 项目如何使用 HttpClient 与 Web 服务通信
.Net Core Console 项目如何使用 HttpClient 与 Web 服务通信
|
5月前
|
Linux Docker 容器
蓝易云 - net.ipv4.ip_forward=0导致docker容器无法与外部通信
完成以上步骤后,Docker容器应该能够正常与外部通信了。
266 2
|
移动开发 监控 网络协议
基于Socket通讯(C#)和WebSocket协议(net)编写的两种聊天功能(文末附源码下载地址)
基于Socket通讯(C#)和WebSocket协议(net)编写的两种聊天功能(文末附源码下载地址)
|
网络协议 安全 Java
.NET网络编程——TCP通信
.NET网络编程——TCP通信
86 0
下一篇
无影云桌面