随笔-254  评论-3298  文章-48  trackbacks-74

Flex与.NET互操作(七):了解FluorineFx的环境配置(远程对象、网关、通道、目的地)

     注:本文内容原本计划在上一篇《Flex与.NET互操作(六):Flex和.NET协同开发利器FluorineFx 》中写出,考虑到写在一起文章内容太长故分为两篇。

     Flex中的远程对象访问,也就是服务端提供一个远程服务对象(RemotingService Object),在Flex客户端通过相应的访问技术去调用远程对象的过程。

     在本系列文章的前面几篇文章中所介绍的访问Webservice的方法,也就是一种远程对象方法,只不过他是基于WEB服务(WebServie)的远程访问,不是基于远程对象(Remoting Object)的的远程访问。要想直接实现基于对象的远程访问是比较麻烦的,然后FluorineFx则专门为我们提供了该功能,通过FluorineFx的核心库来开发远程对象(Remoting Object)服务,具体是怎么实现的呢?FluorineFx要求为远程对象提供[RemotingService]标记来提供远程对象服务,看看下面的RemotingServiceAttribute的详细定义:

1 [AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
2 public sealed class RemotingServiceAttribute : Attribute
3 {
4     public RemotingServiceAttribute();
5     public RemotingServiceAttribute(string serviceName);
6 }

     从上一篇文章中的示例代码可以看出,使用.NET(c#)定义了一个Sample的远程对象服务类,并为其指定了[RemotingService],详细如下:
 1     [RemotingService("Fluorine sample service")]
 2     public class Sample
 3     {
 4         public Sample()
 5         {
 6         }
 7 
 8         public string Echo(string text)
 9         {
10             return "Gateway echo: " + text;
11         }
12     }

 

     从上一篇文章中搭建FluorineFx与.NET的开发环境过程中就已经出现过Flex客户端调用FluorineFx的远程对象示例,下面我们在来看看这个示例:

1     <mx:RemoteObject id="service" destination="fluorine"
2         source="FlexDotNet.ServiceLibrary.Sample">
3             <mx:method name="Echo" result="onResult(event)">
4             </mx:method>
5     </mx:RemoteObject>

 1     <mx:Script>
 2         <![CDATA[
 3             import mx.rpc.events.ResultEvent;
 4             internal function onClick():void
 5             {
 6                 service.Echo(txtInput.text);
 7             }
 8             
 9             internal function onResult(evt:ResultEvent):void
10             {
11                 txtResult.text = evt.result.toString();
12             }
13         ]]>
14     </mx:Script>

 

     如上可实现远程对象访问,通过Flex的非可视化组件<mx:RemoteObject>进行远程对象连接。其中的source属性指定远程对象,格式为全限定名(命名空间+类名)。destination属性是非常重要的,这决定了Flex客户端是否可以正确的访问到远对象,相关配置如下:

1     <destination id="fluorine">
2         <properties>
3             <source>*</source>
4         </properties>        
5     </destination>

 

     在<mx:RemoteObject>组件内部使用<mx:Mothod>组件配置远程对象中的方法,详细见本文前面部分。要真实实现远程对象访问的核心是对象的适配器和连接通道:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <service id="remoting-service"
 3     class="flex.messaging.services.RemotingService"
 4     messageTypes="flex.messaging.messages.RemotingMessage">
 5     <adapters>
 6         <adapter-definition id="dotnet" class="FluorineFx.Remoting.RemotingAdapter" default="true"/>
 7     </adapters>
 8 
 9     <default-channels>
10         <channel ref="my-amf"/>
11     </default-channels>
12 
13     <destination id="fluorine">
14         <properties>
15             <source>*</source>
16         </properties>        
17     </destination>
18 </service>

 

     实际开发中我们可以进行自定义通信通道,默认情况下是使用FluorineFx为我们提供的默认连接通道:

1     <channels>
2         <channel-definition id="my-amf" class="mx.messaging.channels.AMFChannel">
3             <endpoint uri="http://{server.name}:{server.port}/{context.root}/Gateway.aspx" class="flex.messaging.endpoints.AMFEndpoint"/>
4             <properties>
5                 <!-- <legacy-collection>true</legacy-collection> -->
6             </properties>
7         </channel-definition>
8     </channels>
posted on 2009-02-06 23:43 Bēniaǒ 阅读(5476) 评论(12) 编辑 收藏

评论:
#1楼 2009-02-27 14:57 | 胡晨
看到了..这里好多牛人..可是环境太次了
 回复 引用   
#2楼 2009-11-06 17:23 | lcy_20000      
博主,您好,我按您的介绍搭建了一个网站,但一换端口就连Fluorine.aspx 或Console.aspx页面这一层也打不开了.
报如下错误,希望您能帮忙看看是怎么回事.

不知道
services-config.xml中的{server.name}:{server.port}是保存在哪,怀疑是他们保值的配置值有关.先谢谢啦.

SecurityError: Error #2156: 无法使用协议 http 访问端口 123。正在调用的 SWF 是 http://168.160.20.90:123/FluorineWebResource.axd?r=FluorineFxBrowser.swf&t=application%2fx-shockwave-flash。 url: 'http://168.160.20.90:123/Gateway.aspx'
at flash.net::NetConnection/connect()
at mx.messaging.channels::NetConnectionChannel/internalConnect()[E:\dev\3.0.x\frameworks\projects\rpc\src\mx\messaging\channels\NetConnectionChannel.as:179]
at mx.messaging.channels::AMFChannel/internalConnect()[E:\dev\3.0.x\frameworks\projects\rpc\src\mx\messaging\channels\AMFChannel.as:243]
at mx.messaging::Channel/connect()[E:\dev\3.0.x\frameworks\projects\rpc\src\mx\messaging\Channel.as:756]
at mx.messaging::ChannelSet/connectChannel()[E:\dev\3.0.x\frameworks\projects\rpc\src\mx\messaging\ChannelSet.as:1247]
at mx.messaging::ChannelSet/reconnectChannel()[E:\dev\3.0.x\frameworks\projects\rpc\src\mx\messaging\ChannelSet.as:1357]
at flash.utils::Timer/_timerDispatch()
at flash.utils::Timer/tick()




 回复 引用 查看   
#3楼 2009-11-06 17:34 | lcy_20000      
我的端口是从http://168.160.20.90:100 换成http://168.160.20.90:123

换回原来的100就能正常访问Fluorine.aspx 和Console.aspx页面,并进行Flex的调用.

 回复 引用 查看   
#4楼 2009-11-11 14:03 | lcy_20000      
这个问题还没解决,期盼您的回复....
 回复 引用 查看   
#5楼[楼主] 2009-11-11 17:21 | Bēniaǒ      
@lcy_20000
services-config.xml保存在flex配置文件目录里的 。
里面还有remoteing-config.xml等

你部署的程序有端口 那肯定也是需要加端口访问的。

 回复 引用 查看   
#6楼 2010-01-27 16:42 | fanfanlyon      
楼主 请问
我设置设置相对路径 -services "WEB-INF\flex\services-config.xml" 怎么会抱错呢
但是 写成绝对定位就不会错 -services "D:\个人程序\Flex\2\Demo\FlexDotNet\Web\WEB-INF\flex\services-config.xml"

我想相对路径是以.project文件为基准的么?还是以其他文件作为基准?

 回复 引用 查看   
#7楼 2010-01-27 16:43 | fanfanlyon      
楼主 请问
我设置设置相对路径 -services "WEB-INF\flex\services-config.xml" 怎么会抱错呢
但是 写成绝对定位就不会错 -services "D:\个人程序\Flex\2\Demo\FlexDotNet\Web\WEB-INF\flex\services-config.xml"

我想相对路径是以.project文件为基准的么?还是以其他文件作为基准

 回复 引用 查看   
#8楼[楼主] 2010-01-29 12:59 | Bēniaǒ      
@fanfanlyon
这个通常不用设置的,你要设置可以参考我上一篇文章。

 回复 引用 查看   
#9楼 2010-11-30 10:16 | hzexe      
我把它配置在iis7的默认应用程序池下运行,只配置了rtmp服务,站点运行后总开启不了rtmp的端口,必须访问下这个网站端口,或rtmp端口才能"激活",然后运行一段时间又自动关闭了,日志里错误说数组上标溢出...5555

配置环境和实际生产环境差别这么大呢.

 回复 引用 查看   
#10楼[楼主] 2010-11-30 22:17 | Bēniaǒ      
@hzexe
实际上不是rtmp被关闭了,是应用程序池自动关闭了,你查看下这系统文章的评论,其中有一篇有回复是如何解决的。

 回复 引用 查看   
#11楼 2011-11-04 17:21 | 刺客之家      
楼主,发现了一个Flex4与FluorineFX不兼容的地方。
在您上一篇文章中,您提到了一个Flex3项目属性中有配置{context.root}的一个选项。但是在FlashBuilder 4中,项目面板中无法配置这个选项了,我根本没找到在哪可以设置{context.root}这个环境变量。所以只能手动去修改services-config.xml,不使用{context.root}这个环境变量。
请问您遇到过吗?

 回复 引用 查看   
#12楼[楼主] 2011-11-06 19:53 | Bēniaǒ      
@刺客之家
引用刺客之家:
楼主,发现了一个Flex4与FluorineFX不兼容的地方。
在您上一篇文章中,您提到了一个Flex3项目属性中有配置{context.root}的一个选项。但是在FlashBuilder 4中,项目面板中无法配置这个选项了,我根本没找到在哪可以设置{context.root}这个环境变量。所以只能手动去修改services-config.xml,不使用{context.root}这个环境变量。
请问您遇到过吗?

flex 4我没玩过,具体我就不清楚了。

 回复 引用 查看   
发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1378686 03du3mApKzs=
微软最有价值专家(MVP)

微软技术社区精英(CNTAC)

2010年IT博客大赛50强

微软最有影响力开发者(GDI)


Bing Maps开发一群:75662563
微软技术群-重庆站:97035589
RIA技术联盟QQ群:26917590
昵称:Bēniaǒ
园龄:4年6个月
荣誉:推荐博客
粉丝:408
关注:26

随笔分类(285)

文章分类(14)

积分与排名

  • 积分 - 760874
  • 排名 - 60

最新评论