仅通过 Asp.Net Core WebSocket 单向发送消息

问题描述

我正在开发一个 C# Asp.NET Core 应用程序,其中客户端将通过 JavaScript WebSocket 连接到服务器,而服务器本身将是唯一可以向连接的客户端发送消息的东西。

客户端不会将消息发送回服务器,如果他们设法通过在任何浏览器控制台中手动向服务器发送消息,服务器将忽略它们。

这是我用来向所有连接的客户端发送消息的 C# 代码示例:

foreach(WebSocket webSocket in WebsocketHandler.WebSocketClients.Values)
{
    await webSocket.SendAsync(...);
}

由于我不希望客户端将消息发送回服务器(因为这应该是单向消息流),因此后续调用

await webSocket.ReceiveAsync(...);

在完全需要调用“SendAysnc()”之后立即?调用“SendAsync()”后不调用“ReceiveAsync()”是否有缺点/后果?

我在 MS 的文档中找不到任何内容说在调用“SendAsync()”之后需要调用“ReceiveAsync”(尽管大多数在线示例都这样做)并且两种方法(根据 MS 文档)都声明“这操作不会阻塞。”

在这里主要关心的是,是否连续只发送消息而不接收任何返回可能会导致许多“SendAsync()”调用堆积的内存泄漏,因为它期望一些“响应”返回或服务器断开连接客户端,因为没有消息从通信通道的另一端发回,并且服务器认为客户端已掉线。

问候。

解决方法

您需要调用 ReceiveAsync 以便您可以检测 websocket 何时关闭,以便您可以完成关闭握手。通常,当直接使用 websockets 时,您将有 2 个并行运行的异步循环,即接收循环和发送循环(或者您可以像正在做的那样将套接字交给发送)。您还需要确保执行 websocket 升级的请求继续运行,以便连接不会关闭,并且在您的场景中,您可以为此目的使用接收循环​​。