0

Я очень новичок в веб-сайтах и ​​WebAPI (наша система была всего лишь .NET MVC, а не WebAPI), поэтому я могу очень хорошо просто пропустите что-то очевидное (надеюсь).Проблема с сервером веб-сервера: onOpen на стороне клиента, но обработчик веб-дескриптора сервера OnOpen и другие события никогда не попадают

Я пытаюсь реализовать простой клиент для игры. Я работаю в .NET в (к сожалению) VB, и я пытаюсь просто заставить работать websocket и ударять сервер OnOpen/Message/Close событий и клиентскую сторону.

Мой код ниже, но в общем, WebSocket рукопожатия, кажется, происходит без какого-либо вопроса, как мой OnOpen() событие в JavaScript получает удар, и когда я выводить readyState его 1. Однако OnOpen делает НЕ попасть сервер сторона

выход заканчивает тем, как это:

СРОЧНОЕ READYSTATE: 0

OnOpen READYSTATE: 1

Закрыто гнездо

Удалено конструктор для моего WebSocketHandler (например, если я нахожу точку останова в строке MyBase.New(), она попадает в нее). Однако OnOpen никогда не попадает, и сокет немедленно попадает на событие onclose в js .. есть ли что-то, что я должен делать, чтобы открыть сокет? Почему 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 
+0

Быстрое примечание: после публикации этого вопроса я добавил переопределение в OnError в своем коде сервера, чтобы убедиться, что это случайно, но безрезультатно – CTDev

+0

javascript работает нормально. Должна быть ошибка вашего сервера (обратите внимание: я не тестировал с помощью jquery, я просто использовал 'window.addEventListener (« load », testWebSocket, false);» и подключился к 'ws: // echo.websocket.org', который полезен в качестве тестового сервера здесь) – ASDFGerte

+0

Любая идея, что не так с моим сервером? HTTP-запрос, кажется, делает это, признает его как WebSocketRequest, а затем принимает его без ошибок, и, кроме того, мой конструктор WebSocketHandler также попадает, опять же без ошибок.Но тогда это похоже на то, что он сразу же умирает (или, может быть, даже полностью не создается, поскольку OnOpen() никогда не попадает на серверную сторону?). – CTDev

ответ

0

Честно говоря, я не могу сказать со 100% уверенностью, что это исправил, но у меня очень сильное подозрение.

Я включил слишком много пространств имен в свой код, и я верю, что в компиляторе возникла некоторая путаница и т. Д., Когда он действительно запущен. По-видимому, как Microsoft.Web.Websockets, так и пространства имен SignalR BOTH содержат WebSocketHandler. Хотя я не знаю всех входов и выходов SignalR, похоже, что WebSocketHandler в пространстве имен THAT не предназначен для использования вне SignalR. Я считаю, что класс ссылается вместо того, что в Microsoft.Web.Websockets, так как он работает сейчас, но я действительно не слишком сильно менялся. Он также позволяет мне напрямую вызвать конструктор, создав экземпляр нового экземпляра обработчика вместо того, чтобы называть его в лямбда-функции.

В любом случае, если у кого-либо еще есть подобные проблемы, убедитесь, что вы ссылаетесь на правильный!