Blazor Server 页面闲置后 SignalR 断开,如何恢复?
数据小陈
结论
DisconnectedCircuitRetentionPeriod 和 DisconnectedCircuitMaxRetained 用来设置 Blazor Server 在连接断开后保留电路的时长和数量,让客户端有机会重新连接并恢复原电路。它们不会让 SignalR 连接持续活动,也无法保证后台标签页不会断连。
题目中的配置会将断开电路的保留时间设为 60 分钟,最多保留 500 个电路。如果断开只是暂时的,并且用户在电路过期、被清理或服务器进程退出前重新连接,这些设置可能会有帮助。
配置的作用
builder.Services
.AddServerSideBlazor(options =>
{
options.DisconnectedCircuitMaxRetained = 500;
options.DisconnectedCircuitRetentionPeriod = TimeSpan.FromMinutes(60);
});
DisconnectedCircuitRetentionPeriod:电路断开后保留的时长。DisconnectedCircuitMaxRetained:服务器最多保留的断开电路数量。达到上限时,断开的电路可能会被清理。
这些设置只决定断开电路可恢复的时间窗口,不负责保持连接活动。保留更多电路或延长保留时间会增加服务器资源占用,设置时应考虑内存和并发情况。AddSignalR 中的 CorrelationHubFilter 与电路保留是两项不同的配置。仅凭这段代码,无法判断该过滤器是否会影响连接。
建议的排查步骤
- 查看浏览器控制台和服务器日志,确认断开时间、重连是否成功,以及服务器记录的断开原因。
- 检查部署环境中的反向代理、负载均衡器和防火墙是否设置了连接空闲超时,并确认 SignalR 所需的 WebSocket 或其他传输方式可以正常工作。
- 确认断开期间服务器进程是否重启,以及保留的电路是否达到数量上限。服务器进程退出后,延长保留时间也无法恢复内存中的电路状态。
- 在实际浏览器和部署环境中测试切换标签页、锁屏和长时间闲置后的重连行为。浏览器可能限制后台页面活动,因此应用通常无法保证后台连接永不暂停或断开。
- 根据日志和服务器资源调整保留时长与数量,并为无法恢复的连接提供重连提示或重新加载页面的处理方式。
如果项目采用较新的 Blazor Web App 托管模型,服务注册方式可能与示例中的 AddServerSideBlazor 不同,应根据项目实际使用的框架和托管模式进行配置。提高保留时长只能帮助恢复仍可恢复的断开电路,无法单独解决连接问题。
备注:内容仅供参考。
