状态化重连
状态化重连是 ASP.NET Core 的 ack 协议:传输断开时,逻辑连接——包括在途调用、 流与出站缓冲——得以保留。连接断开期间发送的消息会被恰好一次重放, 接收方会过滤重复消息。
为什么重要
普通重连会重新协商并重启逻辑连接:挂起的调用失败,socket 断开时"在途"的消息 丢失。状态化重连保留同一个连接 token 与逻辑状态,因此:
- 长运行的
stream()在断线后不丢不重地继续。 - 客户端断线期间发出的广播,在它回来后送达。
- 已发送但未确认的请求会重发。
开启方式
客户端
connection = HubConnection().with_stateful_reconnect()
服务器
server = SignalRServer(
ChatHub,
options=ServerOptions(
allow_stateful_reconnects=True,
stateful_reconnect_buffer_size=100_000, # 字节
stateful_reconnect_timeout=30.0, # 秒
),
)
状态化重连要求 WebSockets 传输。客户端发送协商标志
useStatefulReconnect=true;服务器同意则回应 useStatefulReconnect: true,
握手使用协议版本 2。