Ich bin sehr neu zu WebSockets und WebAPI (unser System wurde alle .NET MVC, nur nicht WebAPI), so kann ich sehr gut nur etwas offensichtliches vermissen (hoffe ich).Websocket Server Problem: OnOpen Hit Client-Seite, aber Server Websocket-Handler OnOpen und andere Ereignisse nie
Ich versuche, einen einfachen Client zu implementieren, mit dem ich herumspielen kann. Ich arbeite in .NET in (leider) VB, und ich versuche, den websocket gerade zu arbeiten, und die OnOpen/Message/Close Events Server und Client Seite zu treffen.
Mein Code ist unten, aber kurz gesagt, das WebSocket-Handshake scheint ohne jede Frage, wie meine onOpen() Ereignis im Javascript passieren getroffen wird, und wenn ich Ausgang der Readystate seine 1. Jedoch OnOpen nicht der Fall ist getroffen zu Server Seite
Die Ausgabe wie folgt aussehen endet:
SOFORT Readystate: 0
OnOpen Readystate: 1
Socket geschlossen
Der Konstruktor für meine WebSocketHandler wird getroffen (zum Beispiel, wenn ich einen Breakpoint auf der MyBase.New() Zeile werfen, trifft es es). OnOpen wird jedoch nie getroffen, und der Socket trifft sofort das onclose-Ereignis in der js .. soll ich etwas tun, um den Socket offen zu halten? Warum sollte OnOpen nicht getroffen werden?
Mein Code ist unten:
Javascript:
var wsUri = 'ws://' + window.location.hostname + '/api/Chat?username=hello';
var output;
$(document).ready(function() {
//setup and fire
output = document.getElementById("output");
testWebSocket();
})
function testWebSocket() {
//Instantiate the websocket, hopefully opening it
websocket = new WebSocket(wsUri);
writeToScreen("IMMEDIATE READYSTATE: " + websocket.readyState);
//bind event handlers
websocket.onopen = function (evt) { onOpen(evt) };
websocket.onclose = function (evt) { onClose(evt) };
websocket.onmessage = function (evt) { onMessage(evt) };
websocket.onerror = function (evt) { onError(evt) };
}
function onOpen(evt) {
writeToScreen("ONOPEN READYSTATE: " + websocket.readyState);
websocket.send("Websocket's open!")
}
function onClose(evt) {
writeToScreen("Socket closed");
}
function onMessage(evt) {
writeToScreen('RECEIVED: ' + evt.data);
}
function onError(evt) {
writeToScreen('ERROR:' + evt.data);
}
function writeToScreen(message) {
var messageToAppend = document.createElement("p");
messageToAppend.style.wordWrap = "break-word";
messageToAppend.innerHTML = '<span>' + message + '</span>';
output.appendChild(messageToAppend);
}
Server:
Public Class ChatController
Inherits ApiController
Public Function [Get](username As String) As HttpResponseMessage
If HttpContext.Current.IsWebSocketRequest Then
HttpContext.Current.AcceptWebSocketRequest(Function() Tasks.Task.FromResult(New ChatWebSocketHandler(username)))
Return Request.CreateResponse(HttpStatusCode.SwitchingProtocols)
Else
Return Request.CreateResponse(HttpStatusCode.BadRequest)
End If
End Function
Private Class ChatWebSocketHandler
Inherits Microsoft.Web.WebSockets.WebSocketHandler
Public Sub New(username As String)
MyBase.New()
'Do stuff with username eventually.
End Sub
Public Overrides Sub OnOpen()
Debug.WriteLine("Websocket is open")
End Sub
Public Overrides Sub OnMessage(message As String)
Debug.WriteLine("Message Received: " & message)
End Sub
Public Overrides Sub OnClose()
Debug.WriteLine("Websocket Closed")
MyBase.OnClose()
End Sub
End Class
End Class
Kurzer Hinweis: nach dem Posten dieses Eintrags habe ich OnError in meinem Servercode überschrieben, um zu sehen, ob es zufällig darauf trifft, aber ohne Erfolg – CTDev
Javascript scheint gut zu funktionieren. Sollte der Fehler Ihres Servercodes sein (Anmerkung: Ich habe nicht mit jquery getestet, ich habe nur 'window.addEventListener (" load ", testWebSocket, false);' und verbunden mit 'ws: // echo.websocket.org' verwendet, was ist hier als Testserver nützlich) – ASDFGerte
Irgendeine Idee was ist falsch mit meinem Server? Die HTTP-Anfrage scheint es zu machen, erkennt es als WebSocketRequest und akzeptiert es dann ohne Fehler, und außerdem wird mein WebSocketHandler-Konstruktor ebenfalls erneut getroffen, ohne Fehler.Aber dann ist es so, als ob es sofort stirbt (oder vielleicht gar nicht vollständig instanziiert, da OnOpen() nie serverseitig getroffen wird?). – CTDev