Asp.Net Core中SignalR的ConnectionTimeout与DisconnectionTimeout配置问题
你碰到的这个问题很典型——Asp.Net Core SignalR彻底重构了配置体系,原来的GlobalHost已经被移除,所有配置都整合到了依赖注入和中间件的配置流程中。针对你使用的v1.0.0-rc1-final这个早期预览版本,原来的两个参数需要用以下方式来配置:
1. 替代传统SignalR的DisconnectionTimeout
在旧版SignalR里,DisconnectionTimeout是服务器判定客户端断开连接的等待时长。在v1.0.0-rc1-final中,这个逻辑被调整为基于KeepAliveInterval自动计算:服务器会在KeepAliveInterval的2倍时长后,认为客户端已经断开连接。
如果你需要自定义这个超时时间,只需要在配置HubOptions时设置KeepAliveInterval就行,服务器会自动算出断开超时:
services.AddSignalR(options => { // 设置心跳间隔为2.5秒,这样断开超时就是5秒(和你原来的DisconnectionTimeout一致) options.KeepAliveInterval = TimeSpan.FromSeconds(2.5); });
注意:这个自动翻倍的逻辑是该版本的默认行为,后续的正式版SignalR新增了
ClientTimeoutInterval参数,允许直接配置断开超时,但你的rc1版本还不支持这个选项。
2. 替代传统SignalR的ConnectionTimeout
旧版的ConnectionTimeout是客户端等待服务器响应的最大时长,超时后会触发重连。在v1.0.0-rc1-final中,这个配置需要针对具体的传输方式来设置:
针对长轮询(Long Polling)
你可以在UseSignalR的HttpConnectionOptions里配置长轮询的PollTimeout,这个参数就对应原来的ConnectionTimeout:
app.UseSignalR(routes => { routes.MapHub<YourHub>("/yourHubPath"); }, options => { // 设置长轮询的等待超时为20秒(和你原来的ConnectionTimeout一致) options.LongPolling.PollTimeout = TimeSpan.FromSeconds(20); });
针对WebSocket
WebSocket本身是持久连接,默认的超时逻辑已经覆盖了类似场景,一般不需要额外配置。如果确实需要调整,可以通过HttpConnectionOptions中的WebSockets属性来设置,但这个场景很少见。
为什么找不到直接对应的配置项?
v1.0.0-rc1-final是Asp.Net Core SignalR的早期预览版本,很多API还在迭代完善中。后续的正式版(v1.0.0及以后)新增了ServerTimeoutInterval(对应原来的ConnectionTimeout)和ClientTimeoutInterval(对应原来的DisconnectionTimeout),直接在HubOptions里就能配置,这里给你个正式版的示例参考(你的rc1版本用不了):
// 正式版配置示例(仅作参考) services.AddSignalR(options => { options.ServerTimeoutInterval = TimeSpan.FromSeconds(20); options.ClientTimeoutInterval = TimeSpan.FromSeconds(5); });
应该能帮你搞定这个配置问题!
内容的提问来源于stack exchange,提问作者Anwarus

