一个Flex客户端使用BlazeDS连接到两个Web应用程序 - 检测到基于HTTP的重复FlexSession

时间:2011-03-24 18:32:03

标签: flex blazeds

我有一个Flex应用程序,通过BlazeDS与在Tomcat的单个实例中运行的两个webapp进行通信。

Flex客户端由浏览器从第一个webapp加载,一切都很顺利。但是,在对第二个webapp的初始调用中,客户端收到以下错误:

Detected duplicate HTTP-based FlexSessions, generally due to the remote host disabling session cookies. Session cookies must be enabled to manage the client connection correctly.

对同一服务方法的后续调用成功。

我在同一个浏览器页面调用单个webapp的两个flex应用程序的上下文中看到了一些关于引用相同错误的帖子,但似乎没有任何帮助我的情况 - 所以我将非常感激任何人都可以帮忙....

干杯,马克

2 个答案:

答案 0 :(得分:3)

三种可能的解决方案:

  1. 我曾经发现,如果我在设置消息传递通道之前点击远程对象,那么CientID就会搞砸了。尝试在应用程序加载后以及在进行任何远程对象调用之前建立初始消息传递通道。

  2. Flash Builder的网络监控工具可能会导致BlazeDS出现一些问题。我在应用程序加载时设置了一个配置选项,检查我是否在开发环境中(它是在从#1设置我的频道之前调用的)。如果我在开发中,我手动分配一个UID。由于某种原因,这在开发环境之外并不好看......因为我把它全部设置好了所以我不记得为什么会有更好的点:

    if (!(AppSettingsModel.getInstance().dev))
         FlexClient.getInstance().id = UIDUtil.createUID();
    
  3. BlazeDS默认只允许为每个客户端/浏览器设置一个HTTP会话。在我的流媒体频道定义中,我添加了以下内容以允许每个浏览器使用其他会话:

    <channel-definition id="my-secure-amf-stream" class="mx.messaging.channels.SecureStreamingAMFChannel"> 
        <endpoint url="https://{server.name}:{server.port}/FlexClient/messagebroker/securestreamingamf"  
            class="flex.messaging.endpoints.SecureStreamingAMFEndpoint"/>
        <properties>
            <add-no-cache-headers>false</add-no-cache-headers>
            <idle-timeout-minutes>0</idle-timeout-minutes> 
            <max-streaming-clients>10</max-streaming-clients> 
            <server-to-client-heartbeat-millis>5000</server-to-client-heartbeat-millis> 
            <user-agent-settings>
                <user-agent match-on="MSIE" kickstart-bytes="2048" max-streaming-connections-per-session="3" /> 
                <user-agent match-on="Firefox" kickstart-bytes="2048" max-streaming-connections-per-session="3" /> 
            </user-agent-settings>
        </properties>
    

答案 1 :(得分:1)

问题:当flex.warLivecycle.lca文件托管在WebSphere Server上的不同JVM中时,重复会话错误。

解决方案:
在事件的命令文件中,在调用远程服务(Java方法或LC过程)之前,在执行方法中将FlexClientId设置为null。 猜测这种方法也可用于其他场景,以防止重复会话错误。

EventCommand.as file
—————————–

import mx.messaging.FlexClient;
//other imports as per your code

public function execute(event:CairngormEvent):void
{
    var evt:EventName = event as EventName ;

    var delegate:Delegate = new DelegateImpl(this as IResponder);

    //***set client ID to null
    FlexClient.getInstance().id = null;

    delegate.functionName(evt.data);
}