You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#开发Rocket Chat实时API客户端:私信实时接收异常问题

Rocket Chat WebSocket私信实时接收问题排查与修复

核心问题:账号A创建与账号B的私信会话后,账号B的WebSocket客户端无法实时接收消息,重启客户端后才能看到。原因是B的客户端没有自动订阅新生成的私信房间,必须主动监听房间新增事件并完成订阅。

现有代码的问题

  1. RoomSubscribeRequest依赖已知的roomID订阅消息流,但新创建的私信房间ID对B的客户端来说是未知的,创建后不会自动触发订阅。
  2. RoomSubscribeRequest的参数冗余:stream-room-messages订阅不需要额外携带token,token应在WebSocket连接的认证阶段处理。

修复方案

1. 监听房间新增事件

账号B的客户端需要订阅stream-notify-user/{userId}/rooms-changed流,该事件会在用户房间列表变化(包括新增私信)时触发。收到事件后,提取新房间ID并完成订阅。

新增房间变化订阅请求类:

internal class RoomChangedSubscribeRequest : BaseRequest
{
    public List<object> @params;
    public string name;

    public RoomChangedSubscribeRequest(string userId)
    {
        msg = "sub";
        name = $"stream-notify-user/{userId}/rooms-changed";
        @params = new List<object>
        {
            $"user:{userId}",
            new { useCollection = false }
        };
    }
}

2. 修正消息订阅请求参数

移除RoomSubscribeRequest中多余的token参数,简化订阅逻辑:

internal class RoomSubscribeRequest : BaseRequest
{
    public List<object> @params;
    public string name;

    public RoomSubscribeRequest(string roomID)
    {
        msg = "sub";
        name = "stream-room-messages";
        @params = new List<object>
        {
            roomID, 
            new { useCollection = false }
        };
    }
}

3. 完整处理流程

  • 账号B的客户端连接WebSocket并完成认证后,先订阅所有已存在的私信房间的stream-room-messages流。
  • 同时订阅stream-notify-user/{userId}/rooms-changed流。
  • 当账号A创建私信后,B的客户端会收到rooms-changed事件,解析出新增的房间ID,调用修正后的RoomSubscribeRequest订阅该房间,即可实时接收消息。

内容的提问来源于stack exchange,提问作者Nik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 19:37:53