c# - 关闭 websocket 最正确的方法是什么

标签 c# .net-core clientwebsocket

在我的 .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

最佳答案

简单来说,您无法关闭未打开的内容。 SendAsyncReceiveAsyncCloseAsyncCloseOutputAsync 方法在采取任何其他操作之前始终检查套接字的状态。如果状态不是“已连接”,它们会抛出异常。

以下状态被视为“未连接”:

  • 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/

相关文章:

c# - 为 WebSocket 响应选择缓冲区大小

c# - 写入Windows 7 "preview"窗口区域

c# - 类库包 : sl5 target issue

c# - 无法从 .NET Core 2 控制台应用程序中的 config.json 读取数据

c# - 如何使用 Moq 模拟 IMongoCollection.Find

.net - 在 ClientWebSocket 中设置 "User-Agent"HTTP header

c# - UWP NavigationView 通过 MVVM 切换到另一个页面

c# - 注入(inject)创建成本高昂的服务

c# - 将许多元素渲染到 DrawingVisual

Asp.Net 作为客户端打开 websocket