我的问题是,是否可以从同一个Flex应用程序连接到两个不同的BlazeDS服务器?我已经读过这个问题: Can a Flex client app connect to BlazeDS running on a different server? 但是,它似乎正在讨论将Flex客户端连接到不同服务器上的BlazeDS的可能性,但不一定是在另一台服务器上连接另一个 BlazeDS。
我也读过这个问题: One Flex client connecting to two webapps using BlazeDS - Detected duplicate HTTP-based FlexSessions
在我尝试过的尝试中,我收到了上面第二个问题中提到的错误: 检测到基于HTTP的重复FlexSession,通常是由于远程主机禁用会话cookie。必须启用会话cookie才能正确管理客户端连接。
将一个Flex应用程序连接到两个启用BlazeDS的服务器完全不可能吗?我们希望能够拥有一个“通用功能”BlazeDS服务器,该服务器被许多Flex应用程序使用,每个应用程序都有自己的本地BlazeDS服务器用于自己的功能。
//编辑 我目前正在这样做的方式:
在我的mxml文件中,我正在定义一个像这样的通道:
<mx:ChannelSet id="dataService1Channel">
<mx:channels>
<mx:AMFChannel id="dataService1AmfChannel"
channelFault="dataService1Fault(event)"
url="http://localhost:7001/dataservice1/messagebroker/amf"/>
</mx:channels>
</mx:ChannelSet>
然后我在以下配置的数据服务中使用此通道集(当我使用FlashBuilder的“连接到BlazeDS”功能时,它已自动配置)
<dataservice1:DataService1Service id="dataService1Service"
fault="Alert.show(event.fault.faultString + '\n' + event.fault.faultDetail)"
showBusyCursor="true"
channelSet="{dataService1Channel}"/>
其他数据服务的定义如下:
<dataservice2:DataService2Service id="dataService2Service"
fault="Alert.show(event.fault.faultString + '\n' + event.fault.faultDetail)"
showBusyCursor="true"/>
调用工作正常,我可以获取数据,但是我在Flex应用程序中以警报的形式收到了警告。如果我可以压制那个警告,我会很高兴。
答案 0 :(得分:1)
将一个Flex应用程序连接到两个启用BlazeDS的服务器 完全不可能?
是的!假设有适当的crossdomain.xml文件,我认为没有理由你不能这样做。
[注意,从现在开始我假设您正在使用BlazeDS以及RemoteObjects / AMF]
要做到这一点;您最有可能在services-config文件中创建不同的端点。默认端点[至少对于ColdFusion中包含的services-config]自动指向服务SWF的服务器。没有理由不能在同一个services-config文件中创建自己的端点,甚至是不同的端点。如果您觉得有必要,也可以让运行时在运行时进行定义。
我不确定你为什么会收到会话相关的错误;除非您的服务器端代码以某种方式需要会话。
答案 1 :(得分:1)
我在使用SINGLE flex客户端(swf)连接两个BlazeDS服务器时遇到了同样的问题。事实上,正如flex文档所说:
“每个用MXML或ActionScript编写的Flex应用程序最终都会编译成SWF文件。当SWF文件连接到BlazeDS服务器时,会创建一个flex.messaging.client.FlexClient对象来表示该SWF文件。服务器.SWF文件和FlexClient实例具有一对一的映射。在此映射中,每个FlexClient实例都有一个名为id的唯一标识符,BlazeDS服务器生成该标识符。还创建了一个ActionScript单例类mx.messaging.FlexClient Flex应用程序访问其唯一的FlexClient ID。“
例如,您有两个blazeDS服务器。 1)REMOTE 2)LOCAL和单个FlexApp(swf)“MyClient”。
步骤1. MyClient连接到REMOTE blazeDS服务器。因此生成了一个唯一的ID。
步骤2.现在MyClient连接到LOCAL blazeDS服务器。将使用步骤1中生成的相同ID,因为只能为单个FlexApp(swf)生成单个uniqe Id。
步骤3.现在MyClient将重新连接到REMOTE blazeDS服务器。记住,每次FlexApp(swf)连接到blazeDS服务器时,都会生成一个独特的FlexClient以及唯一的id。所以,现在在第3步,我们已经在步骤1中生成了id。因此,它肯定会抛出Duplicate Session异常。
解决方案: 我在应用程序中找到并应用了一种解决方法。有用。 每次FlexApp(swf)切换blazeDS服务器时,都会生成id = null。
FlexClient.getInstance().id=null;
在上面引用的示例中,在步骤1之后创建id = null。现在,当它连接到LOCAL blazeDS时,它将不会使用步骤1生成的id。相反,它将在LOCAL中工作时创建一个新的唯一ID blazeDS模式。
再次从LOCAL切换到REMOTE模式(步骤3)时,请通过此代码片段使id = null。因此,现在当FlexApp(swf)连接到REMOTE blazeDS时,将生成一个新的唯一ID,并且不会出现重复会话异常。
谢谢和问候, Anupam G。