Один клиент Flex, подключающийся к двум веб-приложениям с помощью BlazeDS - обнаружены дубликаты FlexSessions на основе HTTP - PullRequest
1 голос
/ 24 марта 2011

У меня есть гибкое приложение, которое обменивается данными через BlazeDS с двумя веб-приложениями, работающими в одном экземпляре Tomcat.

Flex-клиент загружается браузером из первого веб-приложения и все хорошо. Однако при первом вызове второго веб-приложения клиент получает следующую ошибку:

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.

Последующие вызовы к тому же методу обслуживания успешны.

Я видел несколько постов, ссылающихся на одну и ту же ошибку в контексте двух гибких приложений, вызывающих одно веб-приложение с одной и той же страницы браузера, но ничего, что могло бы помочь моей ситуации - поэтому я был бы очень признателен, если кто-нибудь может помочь ....

Ура, Марк

Ответы [ 2 ]

3 голосов
/ 25 марта 2011

Три возможных решения для вас:

  1. Однажды я обнаружил, что если я нажму на удаленный объект перед настройкой канала обмена сообщениями, то CientID будет облажаться. Попробуйте установить начальный канал обмена сообщениями после загрузки приложения и перед выполнением любых вызовов удаленных объектов.

  2. Инструмент сетевого мониторинга Flash Builder может вызвать некоторые проблемы с BlazeDS. Я настроил опцию конфигурации при загрузке приложения, которая проверяет, нахожусь ли я в среде разработчиков (она вызывается непосредственно перед настройкой моего канала из # 1). Если я в dev, я назначаю 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 голос
/ 25 августа 2011

Проблема: дублирующиеся ошибки сеанса, когда файлы flex.war и Livecycle.lca размещены в отдельных JVM на WebSphere Server.

Решение:
Внутри командного файла для события установите FlexClientId в null в методе execute до вызова удаленной службы (метод Java или LC Process).
Думаю, этот подход можно использовать и в других сценариях, чтобы предотвратить повторяющиеся ошибки сеанса.

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);
}
...