c# - 在 asp.net 核心服务器中处理关闭的 websocket 连接

标签 c# websocket asp.net-core

任何人都可以向我解释如何从意外终止连接的客户端中删除 websockets 吗? 我的意思是用户以错误的方式关闭了应用程序,没有告诉服务器他们想要断开连接? 以及您通常如何处理断开连接。

我尝试了一段代码来监听消息接收并且有一个带有 3s 的 cancellationTokenSource,所以它将检查连接是否仍然存在。当我关闭 websocket 客户端应用程序时,服务器不会转到 WebSocketState.Closed 部分,并且当取消 token 被触发时,服务器会断开与客户端的连接。我在这里做错了什么?! 提前致谢!

while (socket.State == WebSocketState.Open)
{
   var cancellationSource = new CancellationTokenSource(TimeSpan.FromMilliseconds(3000));
   buffer = new ArraySegment<byte>(new byte[4096]);

   WebSocketReceiveResult received = null;


   try
   {
       received = await socket.ReceiveAsync(buffer, cancellationSource);
   }
   catch (AggregateException e)
   {
       continue;
   }

   switch (received.MessageType)
   {
       case WebSocketMessageType.Close:

           HandleClose(socket);

       break;

       case WebSocketMessageType.Text:
           // Handle text message 

       break;
   }
}

if (socket.State == WebSocketState.Aborted)
{
    // Handle aborted
}
else if (socket.State == WebSocketState.Closed)
{
    HandleClose(socket);
}
else if (socket.State == WebSocketState.CloseReceived)
{

}
else if (socket.State == WebSocketState.CloseSent)
{
}

最佳答案

如果客户端意外关闭连接,ReceiveAsync 将抛出一个 WebSocketException

try
{
    var received = await webSocketConnection.ReceiveAsync(...);
}
catch(WebSocketException webSocketException)
{
    if(webSocketException.WebSocketErrorCode == WebSocketError.ConnectionClosedPrematurely)
    {
        //custom logic
    }
}

关于c# - 在 asp.net 核心服务器中处理关闭的 websocket 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44312881/

相关文章:

c# - (为了提高性能)确定异常类型的更好方法是哪种?

c# - 进程不适用于 Ubuntu 但适用于 Windows

qt - 为什么 QWebSocketServer 在客户端连接尝试时发送 TCP [FIN] 消息

使用通配符 SSL 证书在 AWS E2 上部署 Reactjs 应用程序

c# - Asp .Net Core 的 Ibody ModelValidator 替代方案?

c# - 如何为类 C 语言创建 Visual Studio 语法突出显示

c# - 使用 WinSCP .NET 程序集列出具有特定扩展名的文件

c# - 使用图表辅助轴会导致 x 轴和主要 y 轴问题 (Excel)

ssl - 在 Elastic Beanstalk 上同时设置 websockets、粘性 session 和 SSL

javascript - 我可以在Python中通过tornado websocket发送gzip压缩数据吗?