重新连接断开连接的 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) 的最佳实践 的相关文章

  • 如何在 ASP.NET Core 中获取 SignalR Hub 上下文?

    我正在尝试使用以下命令获取集线器的上下文 var hubContext GlobalHost ConnectionManager GetHubContext
  • 如何保留 SignalR 连接 ID

    我正在尝试构建一个聊天应用程序 其中用户 ID 由其自动生成的 signalR 连接 ID 表示 页面刷新时 实例化新连接时连接 ID 会发生变化 有没有办法持久保存用户连接 ID 的状态 直到浏览器会话结束 即直到他结束客户端上的会话 有
  • 将 Autofac 与 SignalR 结合使用时出现范围错误

    我正在尝试注入HttpContextBase在我的 SignalR 中心 public class EventHub Hub IDisconnect private readonly HttpContextBase httpContextB
  • 如何使用角度中的signalr读取从web api发送的数据?

    我想在角度客户端中通过 signalr 读取从 asp net web api 发送的数据 为此 我在下面给出的 Web api 中创建了 Hub ProgressHub cs public class ProgressHub Hub pu
  • SignalR hub 中的上下文为空

    我有一个 Web 表单应用程序并进行测试 以了解 SignalR 如何满足我的要求之一 我的中心代码 using System using System Collections Generic using System Linq using
  • SignalR 和 Pusher 之间的区别

    我想使用 React 作为前端技术创建一个 Web 应用程序 该应用程序的要求是服务器能够向所有客户端更新有关更改的信息 不必是精确的实时时间 但应在不超过 10 秒后更新 像客户端每隔几秒向服务器请求更新这样的解决方案是不可能的 要求 1
  • 不使用jquery实现signalR

    是否可以在不使用 Jquery 的情况下实现 SignalR 我想为 Titanium 创建一个模块 但我不知道 SignalR 对 DOM 的依赖程度如何 jQuery 只用于 ajax 请求吗 你认为这有多难 嗯 这并非不可能 但这需要
  • SignalR 响应覆盖标头

    我构建了一个位于 WebAPI 服务中的简单 SignalR 中心 并在 WebAPI 和 SignalR 上包含了所有必需的 CORS 属性 我的 WebAPI 端点都按预期工作 但 SignalR 却没有 我已经尝试了我能想到的所有方法
  • 请求线程外部的 ASP.NET Core RC2 SignalR Hub 上下文

    我目前正在尝试RC2释放ASP NET Core我遇到了一个问题SignalR 我需要能够在请求线程之外向客户端发送消息 现在 在完整的 NET 框架中 您可以执行以下操作 var context GlobalHost Connection
  • SignalR 客户端无法在 AngularJs 控制器内工作

    我已经根据路线创建了 Angular 应用程序 在不使用路由的情况下 信号器工作正常 但是当我使用路由时 信号器仅以一种方式工作 从客户端到服务器 Scripts a href Today Today a a href History Hi
  • 如何在 ASP.NET Core 应用程序中将记录器传递到服务器端的 SignalR hub

    我有带有 React 客户端的 ASP NET Core 应用程序 我在服务器和客户端之间有 SignalR 消息传递 我在服务器端有以下代码 Startup cs public void Configure IApplicationBui
  • ASP.NET Core SignalR websocket 连接限制

    我使用 Microsoft AspNetCore SignalR Client 对在 Windows Server 2016 标准上托管的 SignalR ASP NET Core 应用程序进行负载测试 安装了 Dotnet 核心托管 2
  • 如何跨域使用 SignalR

    我正在尝试将 SignalR 与跨域一起使用 但在调用启动函数时收到错误消息 错误信息是 Uncaught TypeError Cannot call method start of undefined 我正在使用代码 服务器端 assem
  • Python 的 SignalR 替代方案

    Python 世界中 SignalR 的替代方案是什么 准确地说 我在Windows 8上使用tornado和python 2 7 6 我发现sockjs龙卷风 https github com MrJoes sockjs tornado
  • 通过 SignalR 在 IE 中缺少原型方法

    我遇到了一个问题 即仅在 IE 中并且仅当数组通过 SignalR 时才处理原型方法消失 在本例中为 Array prototype 方法 我写了一个小 愚蠢但简单的概念验证网络应用程序来演示这个问题 代码全部在下面 请注意 当您单击 更新
  • 如果用户不活动,SignalR 会发生什么?

    我想知道如果用户不活动会发生什么 想象一下用户连接到集线器 连接已建立 但用户没有刷新页面或一个小时没有执行任何操作 无论如何连接都会保持吗 那过了这个时间还可以推送消息给他吗 SignalR 发送 keep alive 消息 即使没有其他
  • RavenDB 和 SignalR Nuget 包依赖项冲突

    基本冲突 SignalR 希望 Newtonsoft Json 版本为 4 0 7 或更高版本 而 RavenDB 希望版本等于 4 0 5 这显然意味着它们不能并排安装 因此 除了从其中之一下载源代码并在本地计算出依赖项 然后必须签入从中
  • 带有服务总线的 SignalR Azure 云服务

    我使用 SignalR 构建了一个简单的聊天应用程序那里有教程 http www asp net signalr overview getting started tutorial getting started with signalr
  • SignalR .Net Core 3.1 Web 应用程序无法在本地 IIS 上运行

    尝试使用 ASP Net Core 3 1 和 Angular 基于在线示例创建聊天 以下内容在 IIS Express 上运行良好 但在本地 IIS 上运行不佳 错误信息 WebSocketTransport js 85 WebSocke
  • AspNetCore.SignalR:无法启动未处于初始状态的连接

    我无法让 ASP NET Core SignalR 应用程序正常运行 我有这个服务器端代码 public class PopcornHub Hub private int Users public async Task BroadcastN

随机推荐

  • 为什么 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 然而 偶尔会引发与连接相关的异常 因为服务器没有