【问题标题】:SignalR connection timeouts if browser tab is inactive如果浏览器选项卡处于非活动状态,则 SignalR 连接超时
【发布时间】:2021-05-25 04:16:05
【问题描述】:

如果我保持浏览器选项卡处于活动状态(每 5-6 分钟至少打开一次),我的 WebSocket 连接会通过 ping 请求保持活动状态(参见随附的屏幕截图)。但如果我放弃选项卡 10 分钟左右,/ping 请求停止发生,WebSocket 连接终止。 对此有何解释以及如何绕过它以在设备唤醒时保持连接活动?

PS:我怀疑我们最近迁移到 Azure Web 服务可能与此有关。或者某些浏览器政策可能会改变。 SignalR 实施了几年,我们现在第一次遇到这样的问题。

【问题讨论】:

标签: azure websocket signalr


【解决方案1】:

我们能够通过将断开连接超时时间增加到 90 秒并将服务器上的保持活动属性设置为 10 秒(ASP.NET 应用程序)来缓解此问题。

GlobalHost.Configuration.DisconnectTimeout = TimeSpan.FromSeconds(90);
GlobalHost.Configuration.KeepAlive = TimeSpan.FromSeconds(10);

但我仍在等待 Github 上的官方回复。

【讨论】:

  • 我们遇到了同样的问题,感谢您在上游修复可用之前提供此解决方法(在 SignalR 或 Chromium 中)!
【解决方案2】:

正如 Ben Cameron 已经说过的,我也认为这可能与节流机制有关。 请参阅有关此问题的 StackOverflow 帖子(包含解决方案的想法): SignalR and/or timer issues since Chrome 88

【讨论】:

    【解决方案3】:

    这可能是浏览器上的标签冻结功能。

    我是直接从Microsoft documentation复制过来的

    某些浏览器的标签卡冻结或休眠 减少非活动标签的计算机资源使用的功能。这个可以 导致 SignalR 连接关闭并可能导致不需要的用户 经验。浏览器使用启发式方法来确定选项卡是否应该 进入睡眠状态,例如:

    • 播放音频
    • 持有网络锁
    • 持有 IndexedDB 锁
    • 正在连接到 USB 设备
    • 捕获视频或音频
    • 被镜像
    • 捕获窗口或显示

    注意:这些启发式方法可能会随着时间而改变或因浏览器而异。 检查您的支持矩阵并找出最适合的方法 你的场景。

    为避免让应用进入睡眠状态,应用应触发其中一个 浏览器使用的启发式方法。

    以下代码示例展示了如何使用 Web Lock 来保留标签 唤醒并避免意外的连接关闭。

    JavaScript

    Copy
    var lockResolver;
    if (navigator && navigator.locks && navigator.locks.request) {
        const promise = new Promise((res) => {
            lockResolver = res;
        });
    
        navigator.locks.request('unique_lock_name', { mode: "shared" }, () => {
            return promise;
        });
    }
    

    对于前面的代码示例:

    网络锁是实验性的。条件检查确认 浏览器支持 Web Locks。承诺解析器(lockResolver)是 存储,以便在可以接受的情况下释放锁 标签睡觉。关闭连接时,锁被释放 调用 lockResolver()。释放锁时,允许使用制表符 睡觉。

    【讨论】:

      【解决方案4】:

      这个问题已经解决了。 https://github.com/dotnet/aspnetcore/issues/31079

      解决方案就是将你的 signalr npm 包更新到最新版本。 https://www.npmjs.com/package/@microsoft/signalr

      从 Chrome 88 开始,在以下情况下,计时器会发生密集节流。(https://developer.chrome.com/blog/timer-throttling-in-chrome-88/)

      • 页面已隐藏超过 5 分钟。
      • 链数为 5 或更多。
      • 页面已静默至少 30 秒。
      • WebRTC 未使用。

      超过计时器限制会导致信号器连接中断。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-10-22
        • 1970-01-01
        • 2010-12-18
        • 1970-01-01
        • 2017-02-10
        • 2017-05-26
        相关资源
        最近更新 更多