2012-02-17 3 views
26

Widziałem, jak można uwięzić zdarzenie rozłączenia po stronie klienta za pomocą SignalR przez powiązanie ze zdarzeniem .disconnect.SignalR: wykrywanie stanu połączenia na kliencie

Teraz, gdy już to zrobiłem, chcę wprowadzić klienta w cykl "czekam na ponowne połączenie", w którym ciągle próbuje się połączyć, dopóki nie odniesie sukcesu lub użytkownik anuluje. Czy hub ujawnia właściwość stanu połączenia? Myślę, że coś takiego kodu (pseudo)

var isConnected; 

function onConnected() { isConnected = true; } 

hub.disconnect = function() { while(hub.notconnected) { connect(); } 

Odpowiedz

46

Klient JS próbuje ponownie nawiązać połączenie przez określony czas, który domyślnie wynosi 110 sekund. Można subskrybować zdarzenie connection.stateChanged i otrzymywać aktualizacje po zmianie stanu, aby można było wyświetlić to użytkownikowi, lub zatwierdzić odpowiedź SignalR na różne scenariusze rozłączenia.

Podczas moich testów stan został poprawnie zaktualizowany, aby rozłączyć się i ponownie połączyć itp., Jak można się spodziewać.

More information on signalr connections

function connectionStateChanged(state) { 
    var stateConversion = {0: 'connecting', 1: 'connected', 2: 'reconnecting', 4: 'disconnected'}; 
    console.log('SignalR state changed from: ' + stateConversion[state.oldState] 
    + ' to: ' + stateConversion[state.newState]); 
} 

connection = $.connection(signalR_Endpoint); 
connection.stateChanged(connectionStateChanged); 
connection.start({ waitForPageLoad: false }); 
+7

Nie sądzę, że jest to całkowicie prawdą. Jeśli utracę połączenie z moim serwerem, w końcu zrezygnuje z próby ponownego połączenia i zmusi mnie do ręcznego ponownego uruchomienia połączenia. Nie powiedziałbym, że zawsze próbuje się połączyć. – KingOfHypocrites

+2

Należy zauważyć, że możliwe stany są wyliczane na '$ .signalR.connectionState', np.' $ .signalR.connectionState.connected'. Możesz zobaczyć bieżące użycie dla 'stateChanged' [tutaj] (https://github.com/SignalR/SignalR/wiki/SignalR-JS-Client#connectionstatechanged-handlerchange-) –

+0

Patrząc na klienta [kod] (https: //github.com/SignalR/SignalR/blob/master/src/Microsoft.AspNet.SignalR.Client.JS/jquery.signalR.transports.longPolling.js), nie znalazłem żadnego odniesienia do warunku, który faktycznie przestałby być ponowne połączenie po pewnym czasie. Istnieją jednak obliczenia przesunięcia, które powodują dłuższe i dłuższe czasy pomiędzy nieudanymi próbami ponownego połączenia, aż do udanego połączenia. Sądzę więc, że spróbuje ponownie połączyć się "na zawsze", o ile strona JS będzie żyła w przeglądarce. – Mazrick

8

Klient jest zawsze próbuje się połączyć. Nie musisz się o to martwić. Istnieje zdarzenie, które można ponownie odtworzyć, na wypadek, gdy chcesz coś zrobić po pomyślnym nawiązaniu połączenia.

EDYCJA: Ta zmiana została zmieniona, klient próbuje tylko połączyć się ponownie w określonym czasie. Następnie musisz przechwycić zdarzenie odłączenia i ręcznie uruchomić ponownie.

+0

Czy jest coś specjalnego, co należy zrobić, aby wdrożyć Reconnect? Wygląda na to, że nie otrzymuję rozłączenia zdarzeń Disconnect OR Reconnect. Obecnie robię: $ .connection.hub.disconnect = onDisconnected; $ .connection.hub.reconnect = onReconnected; na kliencie i zaimplementował IDisconnect w centrum. – Heather

+0

@Jon Interfejs IDisconnect jest przeznaczony dla zdarzeń po stronie serwera i działa dobrze (upewnij się, że używasz SignalR 0.4). Po stronie klienta zdarzenie Disconnect nigdy nie jest wyzwalane, ponieważ SignalR nigdy nie jest naprawdę pewien, że jesteś rozłączony (może się to zmienić w przyszłości). Ponownie podłączony powinien działać, ale nie przetestowałem go, więc nie mogę ci w tym pomóc. – nmat

+1

Zauważyłem, że klient C# nie łączy się ponownie, jeśli stan się rozłączył. Muszę przerobić hubConnection.Start(). Czekaj(); (Nie mam pojęcia, czy to dobra praktyka, czy nie!) Mój scenariusz to aplikacja konsolowa na jednym komputerze rozmawiająca z witryną na innej. Jeśli wyczyściłem/przebudowałem stronę internetową, przechodzimy przez ponowne podłączanie, odłączanie i nigdy nie odzyskamy, chyba że wymuszam to ręcznie. – Andiih