2013-03-07 30 views
12

Mam mały projekt współpracujący z SignalR, jednak otrzymuję bardzo niespójne zachowanie.SignalR nie zawsze gotowy po uruchomieniu(). Done()?

<script type="text/javascript"> 
    $(function() { 
     var chat = $.connection.brewBattleHub; 
     $.connection.hub.start().done(function() { 
      $("#broadcast").click(function() { 
       // Call the chat method on the server 
       chat.server.roll($("#username").val(), $("#drinkname").val()); 
      }); 
      chat.server.sendMessage("SignalR loaded..."); 
     }); 
    }); 
</script> 

Kiedy ładuję stronę, czasami widzę komunikat "SignalR loaded", innym razem nie jestem.

Istnieje również inna funkcja na stronie, a czasami to również nie działa. Jeśli kliknę przyciski i sprawię, że wszystko stanie się wystarczająco szybko, w końcu wszystko przejdzie za jednym zamachem ... od tego momentu wszystko jest złote i działa idealnie.

czy start().done()? nie upewnić się, że wszystko jest gotowe?

=== dodatek, nie jestem przedstawieniu jquery mobile (google wspomniano tam jest błąd, gdy robi tak)

+0

Czy kiedykolwiek zastanawiałeś się, co to jest? Myślę, że doświadczam tego samego. – parliament

+0

Szczerze mówiąc nie pamiętam, pamiętam, naprawianie tego: http://stackoverflow.com/questions/15782281/signalr-event-becomes-intermittent-when-deployed-to-a-server/15811049#15811049 może są połączone ? – 4imble

Odpowiedz

6

Spróbuj włączyć rejestrowanie SignalR pomóc debugować problem. Możesz również dodać obsługę fail, jeśli uruchomienie nie powiedzie się (chociaż jest to mało prawdopodobne). Gdy to zrobisz, możesz przejrzeć narzędzia F12 przeglądarki, aby przejrzeć dzienniki JS i sieci.

<script type="text/javascript"> 
    $(function() { 
     $.connection.hub.logging = true; 
     var chat = $.connection.brewBattleHub; 
     $.connection.hub.start().done(function() { 
      $("#broadcast").click(function() { 
       // Call the chat method on the server 
       chat.server.roll($("#username").val(), $("#drinkname").val()); 
      }); 
      chat.server.sendMessage("SignalR loaded..."); 
     }).fail(function (reason) { 
      console.log("SignalR connection failed: " + reason); 
     }); 
    }); 
</script> 
+0

Dodano rejestrowanie i wszystko wydaje się w porządku. Początkowo otrzymuję SignalR: Negotiating z "/ BrewBattle/signalr/negotiate". SignalR: Łączenie się z punktem końcowym websocket 'ws: // blah ... SignalR: Otwarcie Websocket SignalR: Teraz monitorowanie utrzymuje się przy życiu z czasem oczekiwania ostrzeżenia wynoszącym 13333.333333333332 i utraconym czasem połączenia wynoszącym 20000 Następnie klikanie przycisków i "robienie rzeczy" czasami nic nie robi. W końcu wszystkie wydarzenia wybuchają natychmiast. SignalR: wyzwalanie zdarzenia centrum klienta 'addMessage' w hub 'brewBattleHub'. – 4imble

+0

Nie grasz Skrzypkiem przez przypadek? – halter73

+0

Niestety, nie, nie jestem. – 4imble

8

Miałem podobny problem w tym tygodniu, z tym że kod w .done() nigdy nie działał. Włączyłem rejestrowanie i nic nie było nigdy rejestrowane. Po sprawdzeniu konsoli przeglądarki nie wystąpiły żadne błędy. Patrząc w narzędzia programistyczne przeglądarki, mogłem zauważyć, że nie było żadnej aktywności sieciowej, gdy zadzwoniłem do start(). Potwierdziłem, że serwer proxy zwrócony przez $ .connection.myhubclass miał wszystkie moje metody, więc wiedziałem, że może on rozmawiać z serwerem i że kod po stronie serwera został poprawnie skonfigurowany.

Po ponownym przejrzeniu kodu i dokumentacji byłem przekonany, że nie zrobiłem nic złego. SignalR jest tak prosty, że trudno zrobić to źle, jeśli podążysz za przykładami. Przez dłuższy czas biję się o biurko, próbując to rozgryźć.

Potem zauważyłem, że jeśli uruchomię metodę startową SignalR z konsoli, to zadziała. To doprowadziło mnie do przekonania, że ​​próbowało nawiązać połączenie zbyt wcześnie. I rozwiązać swoje problemy poprzez zmianę kodu inicjalizacji z tego:

$.connection.hub.start().done(function() { 
    //Do interesting stuff 
}); 

do tego:

setTimeout(function() { 
    $.connection.hub.start().done(function() { 
     //Do interesting stuff 
    }); 
}, 5000); 

Jestem pewien, że mogę zmniejszyć opóźnienie od 5 sekund do czegoś krótszym jednak dodatkowy czas wydawało się być tym, co było potrzebne, aby przeglądarka była gotowa do utworzenia połączenia. Po tym opóźnieniu rozpoczęło się rejestrowanie, nawiązano połączenie, po stronie serwera OnConnected() uruchomiono i wykonano() na kliencie.

Po ustaleniu tego, dwukrotnie sprawdziłem kolejność ładowania javascript, myśląc, że mógłbym załadować coś nie w porządku, ale kolejność jest zgodna z próbkami SignalR. Wczytuję jQuery, SignalR,/signalr/hubs, a następnie mój skrypt, który inicjuje wszystko.

Jestem otwarty na sugestie, dlaczego to opóźnienie było potrzebne. Nie widzę tego w żadnym dokumencie, więc wiem, że to może być coś, co zrobiłem. Na szczęście dla tej strony niewielkie opóźnienie przed uruchomieniem SignalR nie stanowi problemu.

+1

steve, również wymyśliłem ten mały problem i zrobiłem coś podobnego (na 500ms). Zapewniłem jednak również, że mój 'var chat = $ .connection.brewBattleHub;' został zadeklarowany poza JQuery '$ (function() {', dzięki czemu zachowanie klas proxy znacznie wyprzedza kod hub.start (z powodu do faktu, że nie polega na tym, że DOM jest gotowy do tworzenia tych klas). –

+0

Dodałem metodę '.fail()', ale nie poszło tam, jeśli jest za wcześnie, dlaczego? – Jaider

3

Znalazłem rozwiązanie (w miarę mojego problemu). miałem SignalR obciążenie dla niektórych 7-8 sekund na IE11, próbowałem „debug” go w konsoli i znalazłem przyczynę opóźnienia załadunku:

[13:13:04 GMT +0200 (...)] SignalR: Powiązanie ze zdarzeniem ładowania iframe.
[13:13:09 GMT + 0200 (...)] SignalR: foreverFrame przekroczył limit czasu podczas próby połączenia.
[13:13:09 GMT + 0200 (...)] SignalR: Zatrzymywanie na zawsze ramki.

Zajęło 5 sekund. aby załadować element iframe.

Schludny rozwiązaniem jest, aby włączyć iframe off, jak IE11 można normalnie korzystać longPolling:

$.connection.hub.start(({ transport: ['webSockets', 'serverSentEvents', 'longPolling'] })) 
0

Miałem podobny problem, który pojawił się dopiero, gdy próbuje ponownie nawiązać połączenie po rozłączeniu. Wywołałem start() z programu obsługi rozłączenia, a następnie spróbowałem wysłać wiadomość od start.done(). Otrzymałem komunikat o błędzie, że SignalR nie był gotowy.

Zauważyłem w dzienniku, że start.done() rozwiązano natychmiast, więc w moim przypadku było połączenie od rozłączenia, aby rozpocząć, a następnie wysłać. Dodałem setTimeout w module obsługi rozłączenia, aby rozłączyć i uruchomić i wysłać rozłączenie. To rozwiązało problem dla mnie.

Powiązane problemy