重新连接断开连接的 SignalR 客户端 (JS) 的最佳实践

2023-11-26

我想提高 signalR 客户端的客户端实现的弹性。

目前,我这样做:

hub.server.sendClientNotification(string, appSettings.username());

然而,偶尔会引发与连接相关的异常,因为服务器没有响应或客户端的互联网连接变得不可用。

我想通过排队请求然后执行以下操作来解决此问题:

try {
    // pop from queue
    hub.server.sendClientNotification(string, appSettings.username());
    // success - discard element
} catch (e) {
    // requeue element
}

通过这种实现,我是否需要使用重新初始化我的 signalR 连接$.connection.hub.start在断开连接之间,或者我可以在一段时间内继续尝试集线器传输吗?

这就是我的建议:

var hub = null;

const internalQueue = [];

const states = {
    connecting: 0, connected: 1, reconnecting: 2, disconnected: 4
}

const signalrModule = {};

var isInitialized = false;

const connectSignalR = function () {
    return new Promise(function (resolve, reject) {
        if ($.connection.hub.state == states.connected) {
            resolve();
        } else {
            window.hubReady = $.connection.hub.start({ transport: ["serverSentEvents", "foreverFrame", "longPolling"] });
            window.hubReady.done(function () {
                isInitialized = true;
                resolve();
            });
            window.onbeforeunload = function (e) {
                $.connection.hub.stop();
            };
        }
    })
}

signalrModule.init = function (handleNotification) {
    hub = $.connection.appHub;
    hub.client.clientNotification = handleNotification;
    $.connection.hub.qs = {
        "username": appSettings.username()
    };
    connectSignalR();
}

const tryEmptyQueue = function () {
    connectSignalR().then(function() {
        if (isInitialized) {
            var continueTrying = true;
            while (internalQueue.length && continueTrying) {
                const nextMessage = internalQueue.shift();
                try {
                    hub.server.sendClientNotification(nextMessage, appSettings.username());
                } catch (e) {
                    internalQueue.push(nextMessage);
                    continueTrying = false;
                }
            }
        }
    })
}

signalrModule.sendClientNotification = function (message) {
    if (typeof message != "string") {
        message = JSON.stringify(message);
    }
    if (isInitialized) {
        try {
            hub.server.sendClientNotification(message, appSettings.username());
            tryEmptyQueue();
        } catch (e) {
            logger.log("SignalR disconnected; queuing request", logger.logLevels.warning);
            internalQueue.push(message);
        }
    } else {
        internalQueue.push(message);
    };
}

const internalQueueInterval = setInterval(function () {
    tryEmptyQueue();
}, 5000);

return signalrModule;

跟着文档

在某些应用程序中,您可能希望在连接丢失并且尝试重新连接超时后自动重新建立连接。为此,您可以从 Closed 事件处理程序(JavaScript 客户端上的断开连接事件处理程序)调用 Start 方法。您可能需要在调用 Start 之前等待一段时间,以避免在服务器或物理连接不可用时过于频繁地执行此操作。以下代码示例适用于使用生成的代理的 JavaScript 客户端。

    $.connection.hub.disconnected(function() {
   setTimeout(function() {
       $.connection.hub.start();
   }, 5000); // Restart connection after 5 seconds.
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

重新连接断开连接的 SignalR 客户端 (JS) 的最佳实践 的相关文章

随机推荐

  • 为什么 ValueType.GetHashCode() 是这样实现的?

    From ValueType cs Action Our algorithm for returning the hashcode is a little bit complex We look for the first non stat
  • 使用常量表达式声明数组的大小

    我有一个围绕数组的新类型包装器 我以为我可以使用size of而不是手动传递数组的大小 但编译器认为我错了 use std mem size of size of val repr C packed struct BluetoothAddr
  • 如何在 linq 中编写 EF 以包含小写比较

    我有这样的疑问 select lower Name from User 如何使用 linq to EF 实现相同的效果 避免用户 linq to 反对 var query context Users Select u gt u Name T
  • 如何在本地运行的网页上创建指向本地文件的链接?

    我想要一个 html 文件来组织分散在我的硬盘驱动器中的某些文件 例如 我有两个要链接到的文件 C Programs sort mw C Videos lecture mp4 问题是我希望链接充当文件的快捷方式 我尝试过以下方法 a hre
  • oracle物化视图刷新时间

    有人能告诉我使用以下设置将物化视图设置为刷新的频率吗 按需刷新强制从 sysdate 0 开始 NEXT round sysdate 1 24 1 我想我每小时都会读一次 但我不确定 SQL gt alter session set nls
  • Objective C 类方法与 C 函数

    在从事开源项目时 我遇到了以下 C 函数声明和实现 FSNData h NSString stringForMimeType MimeType type interface FSNData NSObject All the expected
  • 如何创建不振动的 iOS 推送通知?

    我知道如何创建无声推送通知 通过播放无声的声音文件 我还想发送不振动手机的推送通知 当按照下面的建议设置静音声音文件时 手机在锁定或应用程序未激活时仍然会振动 我的有效载荷仍然振动 aps alert loc key SOME KEY ba
  • 如何在elasticsearch中索引geojson文件?

    我正在尝试使用 PYTHON 以 geojson csv 文件和形状文件的形式将空间数据存储到 elasticsearch 中 我是 elasticsearch 的新手 即使在遵循文档后我也无法成功索引它 任何帮助 将不胜感激 示例 geo
  • 防止存储过程同时执行两次

    我有一个 SQL Server 2000 的存储过程 在任何给定时刻只能执行一个实例 有什么方法可以检查并确保该过程当前没有在执行吗 理想情况下 我希望代码是独立且高效 快速 的 我也不想做一些事情 比如创建一个全局临时表来检查它是否存在
  • 如何在C++中生成随机顶点以形成凸多边形?

    我需要为一个简单的凸多边形生成一组顶点 以便使用动态编程对该多边形进行最小权重三角剖分 我考虑取一个半径为 r 的圆 然后取 20 个顶点逆时针移动 然后我将形成一个20个顶点凸多边形但我该怎么做 我怎么知道半径为 r 的圆上的顶点 除了这
  • Asp.Net core 2.0 MVC 锚标记帮助器不工作

    我正在尝试创建一个演示页面 但无法解决下一个问题 并且我尝试了在网络上找到的所有内容 我有一个带有标签助手的锚标签 a class menu link Telefonok a 我还添加了一个 ViewImports cshtml我在其中添加
  • C# WebClient 下载字符串 https

    在网络浏览器中我通常可以加载以下网址 https security ultimatxxxx com 443 Serverstatus ashx 当我这样做时 Webclient DownloadStringAsync https secur
  • 从内存而不是磁盘向 CompilerParameters ReferencedAssemblies 提供程序集?

    我有一个CompilerParameters我用来喂食的物体Microsoft CSharp CSharpCodeProvider对象和一个ICodeCompiler从中派生出的对象 一切正常 我可以即时编译代码 我的问题是引用的程序集 现
  • 如何在 Google App Engine 上使用 Python 发送 JSON 格式的 cookie 数据?

    我正在尝试在 Python 脚本中编码一个对象并将其设置为 cookie 以便我可以使用客户端 JavaScript 读取它 我尝试的各种方法都遇到了问题 一般来说 cookie 的格式化方式会导致 JSON parse 中断 我当前的脚本
  • Angular 6“mat-button-toggle”不是已知元素

    我已经检查过这些问题 mat toolbar 不是已知元素 Angular 5 Jhipster md button 不是已知元素 模板解析错误 mat icon 不是已知元素 材质 2 md datepicker toggle 不是已知元
  • 将选定的文本复制到剪贴板而不使用 Flash - 必须是跨浏览器

    我想要一个按钮来选择文本textarea并将其复制到剪贴板 我似乎找不到任何适用于所有浏览器且不使用 Flash 的解决方案 这当然可行吗 我到处都见过它 但我猜他们使用闪光灯 如果可能的话我真的想远离它 因为有些人没有它 这就是我到目前为
  • grunt uglify 任务失败

    运行 grunt 时 出现以下错误 警告 无法写入 client dist js build js 文件 错误代码 未定义 使用 force 继续 我的 uglify 的配置Gruntfile js uglify build src cli
  • 有没有办法仅使用 CSS 生成给定范围内的随机数?

    例如 类似 div margin left random 100 100 目前无法在纯 CSS 中执行此操作 但是如果您使用 CSS 预处理器 例如LESS 那么您可以执行以下操作 randomMargin Math round Math
  • 隐式与显式链接到 DLL

    何时应隐式或显式链接到 DLL 常见做法或陷阱是什么 显式链接 DLL 的情况相当罕见 主要是因为它很痛苦并且容易出错 您需要为导出的函数编写函数指针声明 并正确获取 LoadLibrary GetProcAddress FreeLibra
  • 重新连接断开连接的 SignalR 客户端 (JS) 的最佳实践

    我想提高 signalR 客户端的客户端实现的弹性 目前 我这样做 hub server sendClientNotification string appSettings username 然而 偶尔会引发与连接相关的异常 因为服务器没有