Signalr 客户端重新连接

Signalr 客户端重新连接,signalr,Signalr,我对(JavaScript)集线器客户端的理解是,如果连接丢失,它将进入“重新连接…”阶段,尝试重新连接。如果不能这样做,它将进入“断开连接”状态,在被要求重新启动之前,它将一直保持该状态 在放弃之前,“重新连接…”阶段要持续多久?我以前读过40秒,但我的客户似乎花的时间少了很多——大约10秒,也许更少。[编辑:别提这部分,我在服务器上配置了10个断开连接作为测试…但忘记了。我知道这是由服务器在协商过程中设置的。有道理!]。。。我更喜欢让客户端不断地重试,直到它被告知中止-这可以做到吗,它会导致

我对(JavaScript)集线器客户端的理解是,如果连接丢失,它将进入“重新连接…”阶段,尝试重新连接。如果不能这样做,它将进入“断开连接”状态,在被要求重新启动之前,它将一直保持该状态

在放弃之前,“重新连接…”阶段要持续多久?我以前读过40秒,但我的客户似乎花的时间少了很多——大约10秒,也许更少。[编辑:别提这部分,我在服务器上配置了10个断开连接作为测试…但忘记了。我知道这是由服务器在协商过程中设置的。有道理!]。。。我更喜欢让客户端不断地重试,直到它被告知中止-这可以做到吗,它会导致问题吗

另一个问题;在重新连接期间。。。阶段,如果我尝试调用一个hub方法(同样,在JS中),它似乎永远不会完成。我使用返回的Deferred来检查“done”和“fail”事件,但这两个事件似乎都没有被调用。这是故意的吗


谢谢。

您一定可以让它不断重新连接

处理客户端上的断开连接事件并调用connection.start:

$.connection.hub.disconnected(function() {
   setTimeout(function() {
       $.connection.hub.start();
   }, 5000); // Re-start connection after 5 seconds
});
这将导致的唯一问题是,您可能会触发对客户端计算机不存在的服务器的无限请求。当你将移动市场引入这种情况时,这会变得更加麻烦(疯狂地消耗电池)

当您尝试在重新连接时调用集线器方法时,信号器将尝试发送您的命令。由于有两个通道,一个用于接收数据,另一个用于发送(用于除web套接字以外的所有传输),因此在某些情况下,在脱机时仍可以发送请求。因此,直到浏览器告知Signal无法成功发出请求,Signal才知道请求是否失败


希望这有帮助

我可能有个线索。。。触摸Web.config会产生appPool循环,这意味着将为新请求创建一个新的工作进程,而现有进程将继续一段时间,直到剩余的请求结束或达到超时。未在超时期间结束的请求将被终止

当长时间运行的任务在旧进程中运行时,Signalr client会重新连接到新进程,因此在执行长时间运行的任务时

GlobalHost.ConnectionManager.GetHubContext()

当客户机连接到“新”集线器时,您实际上得到了“旧”集线器的引用。 这就是Wasp执行的测试成功的原因:他提出了一个新的请求,要求在新创建的worker进程中处理的signalr hub上发布

您可以尝试配置singalr背板(),使用Sql Server()进行配置非常简单。背板应该能够连接两个工作进程,希望您能够在客户端上收到通知

如果这是问题所在,则即使没有背板,新请求生成的通知也可以工作。请注意,背板的真正用途是扩展信号器,即在它们之间连接一个Web服务器群

还请记住,在IIS中运行长时间运行的任务是很难实现的,因为除其他外,IIS执行常规appPool循环,并且对要执行的请求有超时限制。我建议您阅读以下帖子: “如果你认为你可以自己写一个背景任务,很可能你会弄错。我不是在指责你的技能,我只是说这很微妙。另外,你为什么要这么做?”


希望这有帮助

第一个修复方法是引入内存泄漏的一种很棒的方法。@davidfowl在断开连接时重新连接javascript?这到底是怎么造成内存泄漏的?@FireLizzard查看帖子的历史记录,记住重新加入客户端上您已经加入的任何组。