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

Posted

技术标签:

【中文标题】在 asp.net 核心服务器中处理关闭的 websocket 连接【英文标题】:Handling closed websocket connection in asp.net core server 【发布时间】:2017-06-01 16:34:18 【问题描述】:

谁能解释我如何从意外终止连接的客户端中删除 websocket? 我的意思是用户以一种糟糕的方式关闭了应用程序,而没有告诉服务器他们想要断开连接? 以及您通常如何处理断开连接。

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

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)


【问题讨论】:

如果客户端意外关闭 TCP 连接,TCP 栈最终会通知应用层,但不会在正确的协议完成之前。这些协议因用户结束连接的方式而异。请记住,TCP 会尝试保持连接,并且会根据重试时间重试多达 10 次。如果客户端以客户端 TCP 端发送 RST 或 FIN 的方式关闭,则堆栈将按优先级顺序开始清理。完成后,应用程序会收到通知。 @JohnPeters,感谢您的回答!您认为它适合实时游戏服务器还是只是坚持旧的和精细的方式,udp 套接字? 您找到合适的解决方案了吗?我有同样的问题 @Gabrielkotev 你找到解决办法了吗? 不。不幸的是我现在离开了:( 【参考方案1】:

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

try

    var received = await webSocketConnection.ReceiveAsync(...);

catch(WebSocketException webSocketException)

    if(webSocketException.WebSocketErrorCode == WebSocketError.ConnectionClosedPrematurely)
    
        //custom logic
    

【讨论】:

注意 SO_KEEPALIVE 和 SO_CLOSE,在最坏的情况下连接断开而不发送任何 CLOSE,并且客户端在 SO_KEEPALIVE 中建立 7200 秒,可能的解决方法 --> PING 应在 WS 应用程序级别,否则服务器开始强制关闭

以上是关于在 asp.net 核心服务器中处理关闭的 websocket 连接的主要内容,如果未能解决你的问题,请参考以下文章

asp.net 核心中的红隼

在 ASP.NET 中开发 SharePoint Web 部件 [关闭]

如何在asp.net Web方法中修复“改造和Web服务中的500个内部服务器错误”[关闭]

从托管在被 CORS 策略阻止的 Asp.net 核心 Web 服务器中的 Angular 应用程序调用我的休息服务

Web服务器上的更多与更快的核心[关闭]

核心ASP.NET