在我的 .NET Core 控制台应用程序中,我使用 ClientWebSocket 对象的集合来接收一些数据。当出现问题并发生异常时,我想关闭所有 websocket。
我尝试这样做:
foreach (var socket in _sockets)
{
if (socket.State == WebSocketState.Open || socket.State == WebSocketState.Connecting)
{
socket.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, CancellationToken.None).Wait();
}
}
但是在 socket.State == WebSocketState.Connecting
的情况下,有一个异常(exception):
System.AggregateException: 'One or more errors occurred. (The WebSocket is in an invalid state ('Connecting') for this operation. Valid states are: 'Open, CloseReceived, CloseSent')'
我知道我可以将 socket.Abort()
用于 WebSocketState.Connecting
以及 WebSocketState.Open
。
问题是,这是否是关闭连接的最正确方法 - 对于 WebSocketState.Open
使用 CloseAsync
,对于 WebSocketState.Open
使用 Abort
WebSocketState.Connecting
?
最佳答案
简单来说,您无法关闭未打开的内容。 SendAsync
、ReceiveAsync
、CloseAsync
、CloseOutputAsync
方法在采取任何其他操作之前始终检查套接字的状态。如果状态不是“已连接”,它们会抛出异常。
以下状态被视为“未连接”:
WebSocketState.None
WebSocketState.Connecting
WebSocketState.Closed
我们也可以将 WebSocketState.Aborted
添加到列表中。
考虑到这一事实,如果您没有等待关闭请求或发送关闭请求,您可以像下面这样简单地关闭套接字:
foreach (var socket in _sockets)
{
if (socket.State == WebSocketState.Open)
{
await socket.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, CancellationToken.None);
}
}
我看不到代码的其余部分。因此,我假设您尝试同步运行 CloseAsync
方法。我建议您在异步代码中使用 Wait()
之前三思而后行。您实际上阻塞了当前线程并等待Task
完成。你真的需要这个吗?您应该尽可能地使用async
。否则,您可能会很容易在异步代码中陷入死锁。
关于c# - 关闭 websocket 最正确的方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52206520/