Я очень новичок в веб-сайтах и 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
Быстрое примечание: после публикации этого вопроса я добавил переопределение в OnError в своем коде сервера, чтобы убедиться, что это случайно, но безрезультатно – CTDev
javascript работает нормально. Должна быть ошибка вашего сервера (обратите внимание: я не тестировал с помощью jquery, я просто использовал 'window.addEventListener (« load », testWebSocket, false);» и подключился к 'ws: // echo.websocket.org', который полезен в качестве тестового сервера здесь) – ASDFGerte
Любая идея, что не так с моим сервером? HTTP-запрос, кажется, делает это, признает его как WebSocketRequest, а затем принимает его без ошибок, и, кроме того, мой конструктор WebSocketHandler также попадает, опять же без ошибок.Но тогда это похоже на то, что он сразу же умирает (или, может быть, даже полностью не создается, поскольку OnOpen() никогда не попадает на серверную сторону?). – CTDev