【问题标题】:What is the most proper way to close a websocket关闭websocket的最正确方法是什么
【发布时间】:2018-09-06 14:35:36
【问题描述】:

在我的 .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的情况有一个例外:

System.AggregateException: '发生一个或多个错误。 (对于此操作,WebSocket 处于无效状态('正在连接')。有效状态是:'Open, CloseReceived, CloseSent')'

我知道我可以将socket.Abort() 用于WebSocketState.Connecting 以及WebSocketState.Open

问题是关闭连接是否是最合适的方法 - 使用 CloseAsync 代表 WebSocketState.OpenAbort 代表 WebSocketState.Connecting

【问题讨论】:

    标签: c# .net-core clientwebsocket


    【解决方案1】:

    简单地说,你不能关闭没有打开的东西。 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。否则,很容易导致异步代码死锁。

    【讨论】:

      猜你喜欢
      • 2012-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-05
      • 2016-02-27
      • 2015-09-02
      • 2023-04-09
      • 2011-03-21
      相关资源
      最近更新 更多