C#开发Rocket Chat实时API客户端:私信实时接收异常问题
Rocket Chat WebSocket私信实时接收问题排查与修复
核心问题:账号A创建与账号B的私信会话后,账号B的WebSocket客户端无法实时接收消息,重启客户端后才能看到。原因是B的客户端没有自动订阅新生成的私信房间,必须主动监听房间新增事件并完成订阅。
现有代码的问题
RoomSubscribeRequest依赖已知的roomID订阅消息流,但新创建的私信房间ID对B的客户端来说是未知的,创建后不会自动触发订阅。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
相关产品推荐
相关产品推荐

