SignalR客户端休眠场景下消息发送及connectionId有效性问询
SignalR 笔记本休眠场景相关行为说明
1. 合盖静置后服务端发消息的行为
- 笔记本合盖进入睡眠/休眠状态后,本地网络会完全中断,SignalR客户端与服务端的底层传输链路(WebSocket/Server-Sent Events/长轮询)会直接断开
- SignalR服务端默认配置有30秒的断开超时阈值,如果超过该时间未收到客户端的心跳包或任何请求,服务端会主动清理该ConnectionId对应的连接会话资源,标记连接为已断开状态
- 此时服务端向该ConnectionId发送的消息会直接被丢弃,客户端在休眠期间完全无法收到消息
2. 调用SendMessage方法是否抛出异常
默认配置下调用Clients.Client(connectionId).SendAsync("SendMessage", 参数)不会抛出异常:
- SignalR内部会自动校验目标ConnectionId是否存在活跃连接,若连接已销毁,会直接静默忽略该消息,不会向上层业务代码抛出异常
- 只有当你自定义配置了消息送达确认、或者使用了第三方扩展组件要求消息必须送达时,才可能触发异常逻辑
3. 重新开盖后原有ConnectionId的有效性
原有ConnectionId完全无效,且重连后会生成全新的ConnectionId:
- 重新开盖网络恢复后,SignalR客户端(默认开启自动重连的前提下)会主动发起重连请求,服务端会为新的连接会话分配完全不同的新ConnectionId
- 旧的ConnectionId对应的会话已经在超时后被服务端销毁,无法再复用,也无法通过旧Id向重连后的客户端发送消息
小提示:不要将ConnectionId作为用户的长期唯一标识,建议自己维护用户Id与当前活跃ConnectionId的映射关系,重连成功后更新映射即可实现跨重连的消息投递。
内容的提问来源于stack exchange,提问作者Ian McInnes
相关产品推荐
相关产品推荐

