C # HttpListener Префиксы не принимают `ws`, препятствующие подключению JS WebSocket - PullRequest
0 голосов
/ 11 октября 2018

Сценарий

  • Сервер на основе C #
  • Клиент на основе JavaScript

Ситуация

Я создал этот довольно простой "сервер", которыйединственная задача - помочь мне понять, как на самом деле использовать эти веб-сокеты в среде C #.

using (var server = new HttpListener())
{
    server.Prefixes.Add("http://localhost:8080/");
    server.Start();
    while(true)
    {
        var context = server.GetContext();
        if (context.Request.IsWebSocketRequest)
        {
            var cntxt = context.AcceptWebSocketAsync(null).ConfigureAwait(true).GetAwaiter().GetResult();
            var buff = new byte[2048];
            while(cntxt.WebSocket.State == System.Net.WebSockets.WebSocketState.Open || cntxt.WebSocket.State == System.Net.WebSockets.WebSocketState.Connecting)
            {
                cntxt.WebSocket.ReceiveAsync(new ArraySegment<byte>(buff), CancellationToken.None).ConfigureAwait(true).GetAwaiter().GetResult();
                Console.WriteLine(Encoding.UTF8.GetString(buff));
            }
        }
        else
        {
            context.Response.StatusCode = (int)HttpStatusCode.BadRequest;
            using (var writer = new StreamWriter(context.Response.OutputStream))
            {
                writer.Write("<html><body>WEBSOCKET ONLY!</body></html>");
            }
        }
    }
}

Проблема теперь заключается в следующем: когда я пытаюсь добавить префикс веб-сокета с помощью server.Prefixes.Add("ws://localhost:8080"), я получаю System.ArgumentException брошенный, который говорит, что я могу только добавить http и https в качестве принятого протокола.

Дело в том, что, делая это и используя ws = new WebSocket('ws://localhost:8080'); (JavaScript) для подключения к веб-сокету, по понятным причинам ничего не получится,Изменение префикса на HTTP в веб-сокете JS предоставит мне еще одно исключение аргумента сортировки.

Актуальный вопрос

Как на самом деле заставить HttpListener принимать запросы веб-сокетов?

Дополнительная информация

Используется .net Framework - 4.6.1 Браузер, чтобы проверить это был Google Chrome 69.0.3497.100

1 Ответ

0 голосов
/ 11 октября 2018

Причина, по которой вышеперечисленное не работает ... из-за веб-сокета JS, требующего путь.

Изменение префикса HttpListener выше на eg."http://localhost:8080/asdasd/" позволит правильно подключить сокет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...