<p>Событие отключения клиента SignalR не вызывается при потере интернет-соединения</p>

Созданный на 28 апр. 2017  ·  8Комментарии  ·  Источник: SignalR/SignalR

Ожидаемое поведение

$ .Connection.hub.disconnected должен вызываться через 30 секунд после того, как клиент не сможет разговаривать с сервером.

Фактическое поведение

Он пытается подключиться бесконечно

Действия по воспроизведению

Гендель все события

$ .connection.hub.connectionSlow = function () {console.log ("[" + (новая дата ()). toString () + "] SignalR Connection Slow");};
$ .connection.hub.reconnecting = function () {console.log ("[" + (новая дата ()). toString () + "] Переподключение соединения SignalR"); };
$ .connection.hub.reconnected = function () {console.log ("[" + (новая дата ()). toString () + "] SignalR Connection Reconnected");};
$ .connection.hub.disconnected = function () {console.log ("[" + (новая дата ()). toString () + "] Подключение SignalR отключено"); };
$ .connection.hub.stateChanged = функция () {console.log ("[" + (новая дата ()). toString () + "] SignalR StateChange");
$ .connection.hub.logging = true;

Подключиться к Пуску

Выключите Wi-Fi или отключите интернет

Это единственное, что отображается в журналах, событие отключения никогда не запускается.

В Chrome
Ошибка загрузки XHR : POST "

В IE11
[18:02:51 GMT-0700 (US Mountain Standard Time)] SignalR: Открытие длинный запрос опроса на " HTTP: // ххххххх / signalr / переподключение транспорт = longPolling & ClientProtocol = 1,5 & connectionToken = cvKizCrqc3saz0gQuNvTaMeB91jkPeVOP4cBz3ZDgzdsi7iQm4aC25dBr% 2BxjWwEetYS8PEh0jlVuu9Q0UL9RUzBD4klYw3EBhYgP10p0wcBccPYY0BW% 2BSH4EyPxff2AaSBsAfrqsJBiUTrbA5DV7Jw% 3D% 3D & connectionData =% 5B% 7B% 22name% 22% 3A% 22realtimeinboxhub% 22% 7D% 5D '.
SCRIPT7002: XMLHttpRequest: ошибка сети 0x2ee7, не удалось завершить операцию из-за ошибки 00002ee7.

Обратите внимание, что мы не используем веб-сокеты

С фреймами Forever мы видим это, но на клиенте по-прежнему не возникает события отключения.
[18:30:15 GMT-0700 (Горное стандартное время США)] SignalR: Поддержание активности пропущено, соединение может быть мертвым / медленным.
[18:30:22 GMT-0700 (Горное стандартное время США)] SignalR: Истекло время ожидания активности. Уведомление транспорта о потере связи.

[18:30:24 GMT-0700 (US Mountain Standard Time)] SignalR: Обновление IFrame ЦСИ к " HTTP: // ххххх / signalr / переподключение транспорт = foreverFrame & groupsToken = vdn69Z4r7I2HFeyiTwC7V06mYy4t0P67Y5yDr9HGQjhISisu0% 2B484DIW9G0eV33yAqp1TQ8vgH4L07UQ3Uor% 2BAC2FGNsLrH7OEyigVMVsocgSvSzQUmzpStCDvNG2ir3qiOl4ITLOuIKQREA% 2B% 2BUNRg% 3D% 3D & MESSAGEID = S-0% 2C3979 & ClientProtocol = 1,5 & connectionToken = KlY0U0ZuDWgNrsUdhGWsyO2% 2FKk1ltTvvDI25ncWYV% 2FZN% 2BSR9MufllEMiDSZXjNAkHy% 2Be21M7dUXx8% 2BSOb% 2BqoTf2ZUA3c% 2FStYpbJSCv6XBkgKgDKrQd9hKZoW1KTTlVEWN7g9VClztVn1N2Y4FBBLFA% 3D% 3D & connectionData =% 5B% 7B% 22name% 22% 3A% 22realtimeinboxhub% 22% 7D% 5D & TID = 2 & frameId = 1 '.

[18:30:24 GMT-0700 (Горное время США)] SignalR: Фрейм iframe навсегда загрузился и больше не получает сообщения.

Investigate

Самый полезный комментарий

Коллега наконец указал мне на проблему, которую я переопределял обработчики вместо того, чтобы передавать им свою функцию.

$ .connection.hub.disconnected = function () {console.log ("[" + (новая дата ()). toString () + "] Подключение SignalR отключено"); };

против
$ .connection.hub.disconnected (function () {console.log ("[" + (новая дата ()). toString () + "] Подключение SignalR отключено");});

Все 8 Комментарий

К вашему сведению, я подключаюсь с другого компьютера, чем сервер, в отличие от последнего человека, у которого была такая же проблема.

Не существует надежного метода определения того, что кабель отключен, и ожидающие HTTP-запросы могут не быть прерваны, если это произойдет. Транспорт Longpolling - единственный транспорт, у которого нет поддержки (мы пытались добавить его, и он вызвал больше проблем, чем решил). Существует тайм-аут опроса в 120 секунд, после которого клиент должен попробовать повторить опрос, который должен завершиться ошибкой, потому что новые HTTP-запросы, как вы заметили, не могут быть выполнены. Это должно привести к повторному подключению. Кроме того, повторные подключения не являются неопределенными - если клиент не может повторно подключиться в течение тайм-аута, соединение будет закрыто.

@moozzyk Спасибо за быстрый ответ! Я ценю это.
Я полностью понимаю, что вы говорите, но это не то, что я вижу, вот журнал signalR, пытающийся повторно подключиться в течение 10 минут.

Вот код, который я использую для создания журнала

            $.connection.hub.connectionSlow = function(){console.log("[" + (new Date()).toString() + "] SignalR Connection Slow");};
            $.connection.hub.reconnecting = function(){console.log("[" + (new Date()).toString() + "] SignalR Connection Reconnecting"); };
            $.connection.hub.reconnected = function(){console.log("[" + (new Date()).toString() + "] SignalR Connection Reconnected");};
            $.connection.hub.disconnected = function(){console.log("[" + (new Date()).toString() + "] SignalR Connection Disconnected"); };
            $.connection.hub.stateChanged = function () { console.log("[" + (new Date()).toString() + "] SignalR StateChange") };
            $.connection.hub.logging = true;
            RealTimeInboxConect();

 function RealTimeInboxConect() {
            console.log("[" + (new Date()).toString() + "] SignalR RealTimeInboxConect");
            var defered = $.connection.hub.start({ transport: ['foreverFrame', 'serverSentEvents'] });
            defered.fail(function () {
                console.log("[" + (new Date()).toString() + "] SignalR Failed to start Attempt:");                
                setTimeout(function () {
                    RealTimeInboxConect();
                }, 1000);
            });
            defered.done(function () {
                console.log("Done Connectiong");
                $('#sendmessage').click(function () {
                    // Call the Send method on the hub.
                    chat.server.send($('#displayname').val(), $('#message').val());
                    // Clear text box and reset focus for next comment.
                    $('#message').val('').focus();
                });
            });
        }

SignalRLog.txt

Тогда foreverFrame нужно исследовать. Клиенту следует отказаться от повторного подключения, если он не смог восстановить соединение в течение времени ожидания / окна повторного подключения.

Проблема в том, что это не только foreverFrame, sse и long polling, вот еще несколько журналов для каждого из них.
Обратите внимание: все, что я делаю для воспроизведения, - это отключение Wi-Fi.

SignalRLogSSE.txt
SignalRLogLongPolling.txt

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

Есть предложения о том, как сообщить о статусе подключения к пользовательскому интерфейсу?

Коллега наконец указал мне на проблему, которую я переопределял обработчики вместо того, чтобы передавать им свою функцию.

$ .connection.hub.disconnected = function () {console.log ("[" + (новая дата ()). toString () + "] Подключение SignalR отключено"); };

против
$ .connection.hub.disconnected (function () {console.log ("[" + (новая дата ()). toString () + "] Подключение SignalR отключено");});

Эта проблема была закрыта в рамках устранения проблемы, как описано в https://blogs.msdn.microsoft.com/webdev/2018/09/17/the-future-of-asp-net-signalr/. Если вы все еще сталкиваетесь с этой проблемой, не стесняйтесь повторно открыть и оставить комментарий, чтобы сообщить нам об этом! Нам все еще интересно услышать от вас, отставание только что стало немного большим, и нам пришлось провести большую очистку, чтобы снова справиться с ситуацией. Спасибо за ваш отзыв!

Была ли эта страница полезной?
0 / 5 - 0 рейтинги