处理关闭/断开web套接字连接(CloseAsync vs CloseOutputAsync)

本文关键字:CloseAsync vs CloseOutputAsync 连接 套接字 断开 web 处理 | 更新日期: 2023-09-27 18:01:20

我正试图理解和处理web套接字连接可能关闭的不同方式。从msdn:

你可以同时使用CloseAsync和CloseOutputAsync方法客户端发起的和服务器发起的关闭一个AspNetWebSocket连接。这两个方法处理客户端启动以相同的方式发送请求:在客户端向服务器关闭连接时,服务器调用这些方法之一并向客户端发送确认,然后发送方法回报。

对于服务器发起的请求,这两个方法有效不同。CloseAsync方法向客户端发送消息以关闭连接,等待响应,然后返回。的服务器不等待客户端发送的任何附加数据。在相比之下,CloseOutputAsync方法向客户端发送消息以关闭连接并返回,而不等待响应。后方法返回时,您可以调用ReceiveAsync方法并处理附加数据或客户端发送的确认。

在我的应用程序中,客户端基本上坐在那里接收来自服务器的更新,但在打开连接之外从未实际向服务器发送任何内容。然而,客户端还需要能够从他们的端关闭连接。

基本上服务器的角色是坐在那里等待打开连接,发送一堆东西,并处理客户端关闭连接(但从不需要决定是否关闭连接)。

所以无论如何,当我们谈论干净地关闭连接时,客户端需要向服务器发送一条消息,表示它想要关闭连接,对吗?

所以客户端需要这样做:

var x = await closeAsync(WebSocketCloseStatus.NormalClosure, null, CancellationToken.None)

服务器如何知道客户端执行了closeAync?我尝试使用

将一段数据从服务器发送到客户端
await sendAsync(new ArraySegment<byte>(infoBytes), 1, false, cancelled);

并收到一个错误:

"呼叫后收到的消息类型"文本"无效WebSocket.CloseAsync。WebSocket。只有在没有的情况下才应该使用closeassync期望从远程端点获得更多数据。使用WebSocket。CloseOutputAsync’以保持能够接收数据但关闭输出通道。"

那么在服务器端,我如何知道客户端是否试图彻底关闭连接呢?

处理关闭/断开web套接字连接(CloseAsync vs CloseOutputAsync)

服务器端:

 var result = await webSocket.ReceiveAsync(buffer, cancellationToken);
            if (result.MessageType == WebSocketMessageType.Close)
            {
                await webSocket.CloseOutputAsync(WebSocketCloseStatus.NormalClosure, "Closed in server by the client", CancellationToken.None);
                return null;
            }