【问题标题】:Sending Messages One-Way Only Through a Asp.Net Core WebSocket仅通过 Asp.Net Core WebSocket 单向发送消息
【发布时间】:2021-06-02 23:19:56
【问题描述】:

我正在开发一个 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()”调用堆积的内存泄漏,因为它期望一些“响应”返回或服务器断开连接客户端,因为没有消息从通信通道的另一端发回,并且服务器认为客户端已断开。

问候。

【问题讨论】:

    标签: c# asp.net-core websocket sendasync


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 2014-07-27
      • 1970-01-01
      • 2016-12-19
      • 2014-08-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多