我对 websockets 和 WebAPI 很陌生(我们的系统都是 .NET MVC,只是不是 WebAPI),所以我很可能只是遗漏了一些明显的东西(我希望如此)。
我正在尝试实现一个简单的客户端来玩。我在(可悲的)VB中在.NET中工作,我试图让websocket正常工作,并点击OnOpen/Message/Close事件服务器和客户端。
我的代码在下面,但简而言之,websocket 握手似乎没有任何问题,因为我在javascript中的 onOpen() 事件被命中,当我输出 readyState 时,它的值为 1。但是 OnOpen 不会受到服务器端的影响
输出最终看起来像这样:
立即就绪状态:0
开启就绪状态:1
插座关闭
我的 WebSocketHandler 的构造函数被命中(例如,如果我在 MyBase.New() 行上抛出一个断点,它就会命中它)。但是 OnOpen 永远不会被命中,并且套接字会立即命中 js 中的 onclose 事件。我应该做些什么来保持套接字打开?为什么 OnOpen 不会被击中?
我的代码如下:
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);
}
服务器:
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