Websocket服务器问题:onOpen命中客户端,但服务器websocket处理程序OnOpen和其他事件从未命中

时间:2016-10-11 22:24:19

标签: asp.net-mvc vb.net asp.net-web-api websocket system.net.websockets

我对websockets和WebAPI都很陌生(我们的系统一直都是.NET MVC,而不是WebAPI),所以我很可能会错过一些明显的东西(我希望)。

我正在尝试实现一个简单的客户端来玩。我正在.NET中工作(遗憾地)VB,我正在尝试让websocket工作,并点击OnOpen / Message / Close事件服务器和客户端。

我的代码如下所示,但简而言之,websocket握手似乎没有任何问题,因为 javascript 中的onOpen()事件被点击,当我输出readyState时它为1。但是,OnOpen不会受到服务器

的攻击

输出最终看起来像这样:

IMMEDIATE READYSTATE:0

ONOPEN READYSTATE: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

1 个答案:

答案 0 :(得分:0)

说实话,我不能100%肯定地说是什么解决了这个问题,但我有很强烈的怀疑。

我在代码中包含了太多的命名空间,我相信在实际运行时编译器等存在一些混淆。显然,Microsoft.Web.Websockets和SignalR的命名空间都包含WebSocketHandler。虽然我不知道SignalR的所有细节,但看起来THAT命名空间中的WebSocketHandler并不意味着在SignalR之外使用。我相信该类被引用而不是Microsoft.Web.Websockets中的类,因为它现在可以工作,但我真的没有太多变化。它还允许我通过实例化处理程序的新实例来直接调用构造函数,而不必在lambda函数中调用它。

无论如何,如果其他人有类似问题,请确保您引用正确的问题!