SignalR LongPolling mehrere Groups.Add für einen einzelnen Client Ausnahme

9

Ich habe mich eine Weile mit diesem Problem herumgeschlagen. Wir verwenden den neuesten SignalR 2.0.3. Das Problem tritt auf, wenn wir mehrere SignalR-Gruppen hinzufügen. Die Ausnahme wird nur ausgelöst, wenn mehrere Adds von derselben connectionId mit unterschiedlichen Gruppennamen durchgeführt werden. Die Ausnahme wird nur ausgelöst, wenn der LongPolling-Transport ausgewählt ist. Die Ausnahme wird nur ausgelöst, wenn Sie 6 eindeutige Gruppennamen hinzufügen, 5 oder weniger, und es funktioniert einwandfrei.

Hier ist ein vereinfachtes Beispiel:

Index.cshtml:

%Vor%

SignalRTestController.cs:

%Vor%

TestHub.cs:

%Vor%

Startup.cs:

%Vor%

Der Controller nimmt eine ganze Zahl als Eingabe, die die Anzahl der zu erfüllenden Adds darstellt. Zum Beispiel, wenn Sie anrufen:

Ссылка eine Groups.Add funktioniert gut Ссылка zwei Groups.Add funktioniert gut Ссылка drei Groups.Add funktioniert gut Ссылка vier Groups.Add funktioniert gut Ссылка fünf Groups.Add funktioniert gut Ссылка sechs Groups.Add broken Ссылка sieben Groups.Add broken Ссылка acht Groups.Add broken Ссылка neun Groups.Add broken Ссылка zehn Groups.Add broken

...

Wenn ich kaputt sage, bekomme ich eine "System.Threading.Tasks.TaskCanceledException" in TestHub.cs in der Zeile zurück, die darauf wartet, dass die Aufgabe abgeschlossen wird. Alles funktioniert gut mit ServerSentEvents, aber für LongPolling existiert das Problem. Was mache ich falsch? Kann ich mit LongPolling nicht mehr als 5 SignalR-Gruppen haben? Hilf mir! :)

Update: Das Setzen eines 1-Millisekunden-Schlafs mit setTimeout zwischen clientseitigen Anrufen hat das Problem behoben. Dies scheint die Anzahl der ausstehenden Verbindungen auf der Registerkarte Netzwerk zu verringern. Vielleicht passiert etwas mit der Fähigkeit, zu einer Gruppe hinzuzufügen, wenn Sie die Verbindungsgrenze für einzelne Browser erreichen. Es wäre schön zu wissen, warum das nicht funktioniert.

    
Adam 12.06.2014, 19:10
quelle

2 Antworten

2

Sie können mehr als fünf Gruppen mit langem Polling haben, aber Sie müssen das Verbindungsproblem umgehen, indem Sie keine Gruppen zu einer Schleife hinzufügen.

Die von Groups.Add zurückgegebene Aufgabe wird nur abgeschlossen, wenn sie eine ACK-Nachricht vom Nachrichtenbus empfängt, die angibt, dass die Nachricht für den Client (Benachrichtigung der Gruppe add) gesendet wurde. Wenn mehr als 5 (oder welche Zahl auch immer vom Browser erzwungen wird) ausstehende AJAX-Anforderungen, die mit dem addToGroupAndBroadcast -Aufruf vom Client verknüpft sind, anstehen, kann die Nachricht an den Client nicht gesendet werden. Wenn Sie einen Rückruf mit callback an Ihren Client-Anruf anhängen:

%Vor%

Sie werden sehen, dass der erste Anruf fast sofort abgeschlossen wird.

Dies ist der Zeitpunkt, zu dem der erste Groups.Add-Aufruf zurückgegeben wird. Die Nachricht an sayHello wird nicht mehr gesendet, da dies eine weitere offene Abfrageanforderung erfordert, die der Client erstellt, aber nicht verarbeitet wird, da mehrere andere ausstehende Anforderungen vom Client vorhanden sind, die zuerst in die Warteschlange eingereiht wurden (und diese warten alle auf addToGroupAndBroadcast , um abzuschließen.

Nach dem ersten Aufruf von Groups.Add kann der Server also nichts an den Client senden, der MessageHub kann seine ACK nicht senden, wodurch die verbleibenden Groups.Add -Versprechungen aufgelöst werden. Daher wird TaskCanceledException wegen eines Zeitlimits für diese Tasks ausgelöst.

Als Umgehungslösung würde ich vorschlagen, eine Hub-Methode zu erstellen, die ein Array von Gruppennamen akzeptiert:

%Vor%     
Lars Höppner 22.06.2014, 13:51
quelle
0

Es sieht so aus, als gäbe es ein ähnliches Problem, das hier behoben wurde Ссылка . Wenn das der Fall ist, müssten Sie den Code ziehen und Ihre eigene DLL neu kompilieren. Ihr Fehler könnte auch durch eine Zeitüberschreitung verursacht werden.

Dies könnte auch für Ihr Problem relevant sein:

  

... weil die Verbindungs-ID, die Sie versuchen,   Entfernen ist möglicherweise nicht mehr verfügbar. In diesem Fall,   TaskCanceledException wird nach dem Timeout der Anfrage ausgelöst.

Ref. Ссылка

    
user1477388 17.06.2014 13:04
quelle

Tags und Links