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
抛出,这告诉我我只能添加 http
和 https
作为接受的协议。
事情是:这样做并使用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 连接的主要内容,如果未能解决你的问题,请参考以下文章