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:
SendDataToRemoteServer wartet auf Client-Daten und der Client hat noch keine Daten zu senden
SendDataToClient empfängt leere Daten vom Remote-Server, dh der Remote-Server startet die Verbindung. Beenden Sie SendDataToClient
AcceptWebSocketConnection wird beendet, weil Task.WhenAny(SendDataToRemoteServer(conn, websocket, DisconnectionToken, tcs), SendDataToClient(conn, websocket, DisconnectionToken, tcs.Task))
Erwartet, dass ASP.NET alle Daten vor dem Schließen der TCP-Verbindung sendet, aber ASP.NET die Verbindung sofort schließt (azurblau).
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.
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%