Schließen Sie die ASP.NET-Verbindung, bevor Sie alle Websocket-Daten an den Client senden

8

Ich habe einen einfachen asp.net-Websocket-Handler als Gateway zwischen einem entfernten Datenverarbeitungsserver und Clients geschrieben. Ich habe in meinem lokalen Rechner (win8, IIS EXPRESS 8) getestet und alles hat gut funktioniert. Aber in der azurblauen Website schließt ASP.NET die Verbindung, bevor alle Websocket-Daten an den Client gesendet werden.

Nachfolgend ist mein Datenübertragungscode:

%Vor%

Problemszenario:

  1. SendDataToRemoteServer wartet auf Client-Daten und der Client hat noch keine Daten zu senden

  2. SendDataToClient empfängt leere Daten vom Remote-Server, dh der Remote-Server startet die Verbindung. Beenden Sie SendDataToClient

  3. AcceptWebSocketConnection wird beendet, weil Task.WhenAny(SendDataToRemoteServer(conn, websocket, DisconnectionToken, tcs), SendDataToClient(conn, websocket, DisconnectionToken, tcs.Task))

  4. Erwartet, dass ASP.NET alle Daten vor dem Schließen der TCP-Verbindung sendet, aber ASP.NET die Verbindung sofort schließt (azurblau).

comphilip 18.06.2014, 03:35
quelle

2 Antworten

1

Eine WebSocket-Nachricht kann in verschiedene Frames aufgeteilt werden. Sie überprüfen nicht, ob die Nachricht abgeschlossen ist. Der Code zum Senden von Informationen aus einer WS-Verbindung zu anderen sollte folgendermaßen aussehen:

%Vor%

Sie müssen die Eigenschaft EndOfMessage überprüfen und weiterlesen, während die Nachricht nicht abgeschlossen ist.

Es funktioniert auf Ihrem lokalen Computer, da Sie lokal nicht von der Pufferung betroffen sind oder weil die Nachrichten, die Sie versuchten, kleiner waren.

    
vtortola 18.06.2014 14:52
quelle
0

await Task.WhenAny wartet auf die Ausführung einer Aufgabe. wartet nicht, bis der SendDataToClient-Task abgeschlossen ist, wenn der SendDataToRemoteServer-Task abgeschlossen ist.

Sie müssen ändern

await Task.WhenAny(SendDataToRemoteServer(conn, websocket, DisconnectionToken, tcs), SendDataToClient(conn, websocket, DisconnectionToken, tcs.Task));

bis

await Task.WhenAll(SendDataToRemoteServer(conn, websocket, DisconnectionToken, tcs), SendDataToClient(conn, websocket, DisconnectionToken, tcs.Task));

Mit einem kleinen Beispiel:

%Vor%     
levent 21.03.2017 14:02
quelle

Tags und Links