C# HttpListener Prefixes 不接受 `ws` 阻止 JS WebSocket 连接

Posted

技术标签:

【中文标题】C# HttpListener Prefixes 不接受 `ws` 阻止 JS WebSocket 连接【英文标题】:C# HttpListener Prefixes not accepting `ws` preventing JS WebSocket to connect 【发布时间】:2018-10-11 09:57:11 【问题描述】:

场景

基于 C# 的服务器 基于 javascript 的客户端

情况

我创建了这个相当简单的“服务器”,它唯一的工作就是帮助我了解如何在 C# 环境中实际使用这些 websocket。

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") 添加 websocket 前缀时,我得到一些 System.ArgumentException 抛出,这告诉我我只能添加 httphttps 作为接受的协议。

事情是:这样做并使用ws = new WebSocket('ws://localhost:8080'); (JavaScript) 连接到 websocket,显然没有任何结果。 在 JS websocket 中将前缀更改为 HTTP,将为我提供另一个排序参数异常。

实际问题

如何真正让 HttpListener 接受网络套接字请求?

更多信息

使用.net 框架是4.6.1 用于测试的浏览器是 Google Chrome 69.0.3497.100

【问题讨论】:

【参考方案1】:

上面没有工作的原因......是由于JS websocket需要路径。

将上述HttpListener 前缀更改为例如。 "http://localhost:8080/asdasd/" 将允许套接字正确连接。

【讨论】:

那么它在 javascript 端是如何工作的,您是使用“ws://localhost:8080/asdasd”还是其他方式连接?

以上是关于C# HttpListener Prefixes 不接受 `ws` 阻止 JS WebSocket 连接的主要内容,如果未能解决你的问题,请参考以下文章

.Net HttpListener 的多线程

http 异步 接收 回传 数据文字和文件流

使用 C# HttpListener 处理多个请求

使用 C# HttpListener 提供大文件

使用 C# HttpListener 时无法设置 MIME 类型

SSL 上的 C# HttpListener 完全失败