2013-03-07 11 views
12

Ich habe ein kleines Projekt, das mit SignalR arbeitet, aber ich bekomme ein sehr inkonsistentes Verhalten.SignalR nicht immer bereit nach Start(). Done()?

Wenn ich die Seite lade, sehe ich manchmal die Meldung "SignalR geladen", andere Male bin ich nicht.

Es gibt auch andere Funktionen auf der Seite, und manchmal funktioniert das auch nicht. Wenn ich auf Knöpfe klicke und Dinge geschehen lasse, wird es irgendwann alles auf einmal passieren ... ab diesem Punkt ist alles golden und funktioniert perfekt.

funktioniert start().done()? nicht sicherstellen, dass alles bereit ist?

=== Nachtrag, ich bin nicht jQuery Mobile Referenzierung (google erwähnt es ein Fehler ist, wenn dies zu tun)

+0

Haben Sie jemals herausgefunden, was das ist? Ich denke, ich habe das gleiche erlebt. – parliament

+0

Ich kann mich ehrlich gesagt nicht erinnern, ich erinnere mich, dies zu beheben: http://stackoverflow.com/questions/15782281/signalr-event-becomes-intermittent-when-deployed-to-a-server/15811049#15811049 vielleicht sind sie verbunden ? – 4imble

Antwort

6

ermöglicht Versuchen SignalR Protokollierung debuggen Ihr Problem zu helfen. Sie können auch einen fail Handler hinzufügen, falls der Start nicht erfolgreich ist (obwohl dies unwahrscheinlich ist). Sobald Sie dies getan haben, können Sie in den F12-Tools Ihres Browsers nach den JS- und Netzwerkprotokollen suchen.

+0

Die Protokollierung hinzugefügt und alles scheint in Ordnung zu sein. Zunächst bekomme ich SignalR: Verhandeln mit '/ BrewBattle/signaler/negotiate'. SignalR: Verbindungsendpunkt ‚ws WebSocket: // blah ... SignalR: Websocket geöffnet SignalR: Jetzt Überwachung lebendig halten mit einer Warnung Timeout von 13333,333333333332 und eine Verbindung verloren Timeout von 20000 Dann klicken Tasten und‚Dinge zu tun‘ macht manchmal gar nichts. Schließlich feuern alle Ereignisse auf einmal. SignalR: Auslösen des Client-Hub-Ereignisses 'addMessage' auf dem Hub 'brewBattleHub'. – 4imble

+0

Sie betreiben Fiddler nicht zufällig? – halter73

+0

Leider nein, ich bin nicht. – 4imble

8

Ich hatte ein ähnliches Problem diese Woche, außer dass der Code in .done() nie ausgeführt wurde. Ich habe die Protokollierung aktiviert und es wurde nie etwas protokolliert. Beim Überprüfen der Browserkonsole gab es keine Fehler. In den Dev Tools des Browsers sah ich, dass es keine Netzwerkaktivität gab, als ich start() anrief. Ich bestätigte, dass der Proxy, der von $ .connection.myhubclass zurückgegeben wurde, alle meine Methoden auf ihm hatte, also wusste ich, dass es mit dem Server sprechen konnte und dass der serverseitige Code richtig eingerichtet wurde.

Nachdem ich den Code und die Dokumentation immer und immer wieder gelesen hatte, war ich überzeugt, dass ich nichts falsch gemacht habe. SignalR ist so einfach, dass es ziemlich schwer ist, es falsch zu machen, wenn man den Beispielen folgt. Ich schlug lange auf den Schreibtisch und versuchte, das herauszufinden.

Dann bemerkte ich, dass es funktionieren würde, wenn ich SignalRs Startmethode von der Konsole aus ausführen würde. Das hat mich dazu gebracht zu glauben, dass es versuchte, die Verbindung zu früh zu starten. Ich löste meine Probleme, die durch den Initialisierungscode von diesem Wechsel:

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

Um dies:

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

Ich bin sicher, dass ich diese Verzögerung von 5 Sekunden bis etwas reduzieren kann kürzer, aber die zusätzliche Zeit erschienen Was benötigt wurde, um den Browser für die Erstellung der Verbindung bereit zu machen. Sobald diese Verzögerung eingetreten war, funktionierte die Protokollierung, die Verbindung wurde hergestellt, die Server-Seite OnConnected() lief und done() wurde auf dem Client ausgeführt.

Nachdem ich das herausgefunden hatte, überprüfte ich die Reihenfolge meiner Javascript-Ladevorgänge und dachte, dass ich vielleicht etwas außer Betrieb geladen habe, aber die Reihenfolge stimmt mit den SignalR-Beispielen. Ich lade jQuery, SignalR,/signager/Hubs, dann meine Skriptdatei, die alles initialisiert.

Ich bin offen für Vorschläge, warum diese Verzögerung benötigt wurde. Ich sehe es in keinem der Dokumente, also weiß ich, dass es etwas sein könnte, was ich getan habe. Zum Glück für diese Seite ist eine kleine Verzögerung vor dem Start von SignalR kein Problem.

+1

Steve, ich dachte mir auch dieses kleine Problem und hatte eine ähnliche Sache gemacht (auf 500ms). Ich habe aber auch dafür gesorgt, dass mein 'var chat = $ .connection.brewBattleHub;' AUSSERHALB der jquery '$ (function() {' deklariert wurde, wodurch die Erstellung der Proxy-Klassen weit vor dem hub.start-Code (fällig zu der Tatsache, dass es nicht darauf angewiesen ist, dass das DOM bereit ist, diese Klassen zu erstellen) –

+0

Ich habe eine '.fail()' Methode hinzugefügt, aber es ging nicht dorthin, wenn es zu früh ist, warum? Es sollte fehlschlagen. – Jaider

3

Ich habe eine Lösung gefunden (soweit bei meinem Problem). I SignalR Belastung für einige 7-8 Sekunden auf IE11 hatte, habe ich auf „debug“ es in der Konsole versucht, und ich habe die Ursache der Ladeverzögerung gefunden:

[13.13.04 GMT +0200 (...)] SignalR: Bindung an das Ladeereignis von iframe.
[13:13:09 GMT + 0200 (...)] SignalR: foreverFrame ist beim Verbindungsaufbau abgelaufen.
[13:13:09 GMT + 0200 (...)] SignalR: Stoppen für immer Frame.

Es dauerte 5 sek. um zu versuchen, Iframe zu laden.

Die saubere Lösung ist die iframe auszuschalten, wie IE11 normalerweise longPolling verwenden kann:

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

ich ein ähnliches Problem hatte, die nur auftrat, wenn die Verbindung nach disconnect wiederherzustellen versuchen. Ich rief start() vom Disconnect-Handler und versuchte dann eine Nachricht von start.done() zu senden. Dann bekam ich eine Fehlermeldung, dass SignalR nicht bereit war.

Ich bemerkte im Protokoll, dass start.done() sofort aufgelöst, so gab es in meinem Fall einen Anruf von trennen zu starten und dann zu senden. Ich habe ein setTimeout im disconnect-Handler hinzugefügt, so dass start und send von der Trennung getrennt waren. Das hat das Problem für mich gelöst.