Поведение переподключения при длительном опросе SignalR

Используя постоянное соединение SignalR с клиентом длительного опроса JS, мы видим непоследовательное поведение при повторном подключении в разных сценариях. Когда сетевой кабель клиентской машины отключен, соединение JS не переходит в состояние повторного подключения и никогда (по крайней мере, через 5 минут) не переходит в состояние отключения. Для других сценариев, таких как перезапуск веб-приложения IIS, JS-соединение с длительным опросом действительно переходит в состояние повторного подключения и успешно переподключается. Я понимаю, что причиной этого является то, что keep-alive не поддерживается для транспорта с длительным опросом.

Я вижу, что на github было сделано предложение улучшить поддержку повторных подключений для транспорта с длинным опросом (https://github.com/SignalR/SignalR/issues/1781), но, похоже, нет никаких обязательств по его изменению.

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

Ваше здоровье


person xsov    schedule 29.10.2013    source источник


Ответы (1)


Мы обсудили различные альтернативы для поддержки функции «лайк» для длительного опроса; однако из-за того, что опрос работает скрытно, его нелегко реализовать, не затрагивая подавляющее большинство пользователей. Поскольку мы продолжаем обсуждать «правильное» решение, я оставлю вам один обходной путь для обнаружения сбоя сети в клиенте длительного опроса (если это абсолютно необходимо).

Создайте метод сервера, назовем его ping:

public class MyHub : Hub
{
    public void Ping()
    {
    }
}

Теперь на клиенте создайте интервал, в котором вы будете "пинговать" сервер:

var proxy = $.connection.myHub,
    intervalHandle;  
...
$.connection.hub.disconnected(function() {
    clearInterval(intervalHandle);
});  
...  
$.connection.hub.start().done(function() {
    // Only when long polling
    if($.connection.hub.transport.name === "longPolling") {
        // Ping every 10s
        intervalHandle = setInterval(function() {
            // Ensure we're connected (don't want to be pinging in any other state).
            if($.connection.hub.state === $.signalR.connectionState.connected) {
                proxy.server.ping().fail(function() {
                    // Failed to ping the server, we could either try one more time to ensure we can't reach the server
                    // or we could fail right here.
                    TryAndRestartConnection(); // Your method
                });
            }
        }, 10000); 
    }
});

Надеюсь это поможет!

person N. Taylor Mullen    schedule 29.10.2013
comment
Спасибо за Ваш ответ. Обнаружение отключения на клиенте абсолютно необходимо для работы нашего приложения, поэтому я думаю, что мы будем использовать какой-то периодический пинг, как вы предлагаете. Спасибо! - person xsov; 30.10.2013