0

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 
+0

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

+0

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

+0

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

Antwort

0

ehrlich zu sein, ich kann nicht mit 100% iger Sicherheit sagen, was dieses Problem behoben, aber ich habe einen sehr starken Verdacht.

Ich habe zu viele Namespaces in meinen Code aufgenommen und ich glaube, es gab einige Verwirrung im Compiler usw., als es tatsächlich lief. Offenbar enthalten sowohl Microsoft.Web.Websockets als auch SignalRs Namespaces BEIDE WebSocketHandler. Während ich nicht alle Ins und Outs von SignalR weiß, sieht es aus wie WebSocketHandler in THAT Namespace ist nicht für die Verwendung außerhalb von SignalR gedacht. Ich glaube, dass in Microsoft.Web.Websockets auf die Klasse verwiesen wurde, wie es jetzt funktioniert, aber ich habe wirklich nicht zu viel geändert. Außerdem kann ich den Konstruktor direkt aufrufen, indem ich eine neue Instanz des Handlers instanziiere, anstatt sie in einer Lambda-Funktion aufrufen zu müssen.

Wie auch immer, wenn jemand anderes ähnliche Probleme hat, stellen Sie sicher, dass Sie auf den richtigen verweisen!

Verwandte Themen