System.Net.WebSockets 在服务器侦听之前连接打开
System.Net.WebSockets Connection OPEN before server is listening
我 运行 遇到了一个设置问题,该设置在负载下接受连接并将其设置为打开,然后再从套接字读取服务器。
示例(不是实际代码):
while (true) {
var objContext = HttpListenerContext.GetContext();
if (objContext.Request.IsWebSocketRequest){
var WebSocket = (await HttpListenerContext.AcceptWebSocketAsync(null)).WebSocket;
while (WebSocket.State == WebSocketState.Open) {
var buffer = new byte[BUFFERSIZE];
var result = await WebSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken);
....
}
}
}
在调用 AcceptWebSocketAsync 后我注意到在客户端和服务器上添加断点时,客户端收到连接 'OPEN' 并准备好使用并开始发送数据。
问题是 ReceiveAsync 那时还没有启动,原因是 ReceiveAsync 启动任务的速度有点慢 运行,它们在 WaitingForActivation 中的停留时间比在空闲系统上要长一些由于有问题的服务器处于高负载下(许多其他 tasks/threads 而 cpu 的数量很少)。
这是正常行为吗?如何停止?
如果有人检查我的代码,那个人发现稍后调用的 ReceiveAsync 不是问题,信息在缓冲区中。
事件处理程序附加得太晚了。
我 运行 遇到了一个设置问题,该设置在负载下接受连接并将其设置为打开,然后再从套接字读取服务器。
示例(不是实际代码):
while (true) {
var objContext = HttpListenerContext.GetContext();
if (objContext.Request.IsWebSocketRequest){
var WebSocket = (await HttpListenerContext.AcceptWebSocketAsync(null)).WebSocket;
while (WebSocket.State == WebSocketState.Open) {
var buffer = new byte[BUFFERSIZE];
var result = await WebSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken);
....
}
}
}
在调用 AcceptWebSocketAsync 后我注意到在客户端和服务器上添加断点时,客户端收到连接 'OPEN' 并准备好使用并开始发送数据。
问题是 ReceiveAsync 那时还没有启动,原因是 ReceiveAsync 启动任务的速度有点慢 运行,它们在 WaitingForActivation 中的停留时间比在空闲系统上要长一些由于有问题的服务器处于高负载下(许多其他 tasks/threads 而 cpu 的数量很少)。
这是正常行为吗?如何停止?
如果有人检查我的代码,那个人发现稍后调用的 ReceiveAsync 不是问题,信息在缓冲区中。
事件处理程序附加得太晚了。