SignalR 完成事件触发得太快

标签 signalr

SignalR 在我的开发机器和我们的开发测试服务器上运行良好,但是当我将其部署到我们的验收测试机器(应该与开发测试机器配置相同)时,我得到一个

Uncaught Error: SignalR: Connection has not been fully initialized. Use .start().done() or .start().fail() to run logic after the connection has started.

我也跟踪了这个问题,即在连接实际准备好使用之前,signalR 过早调用完成函数

有人遇到同样的问题吗?

完整代码可以在这里找到 https://github.com/AndersMalmgren/SignalR.EventAggregatorProxy/blob/master/SignalR.EventAggregatorProxy.Client.JS/jquery.signalR.eventAggregator.js

相关代码,处理所有SignalR通信的类的构造函数

var Proxy = function (eventAggregator) {
    this.eventAggregator = eventAggregator;

    this.hub = $.connection.eventAggregatorProxyHub;
    this.hub.client.onEvent = this.onEvent.bind(this);
    this.queueSubscriptions = true;
    this.queuedSubscriptions = [];
    $.connection.hub.start().done(this.onStarted.bind(this));
};

我正在对所有调用进行排队,直到调用完成为止

onStarted: function () {
    this.queueSubscriptions = false;
    this.sendSubscribeQueue();
}

但是,Done 是直接调用的(我认为它实际上与启动函数同步调用),当发送第一条消息时,我收到上述消息

解决方案:

我发现了问题,我们使用的是MVC4捆绑,并且部署脚本在部署之前没有清除目标区域。因此,脚本文件夹中有多个版本的 signalR,并且捆绑框架会加载所有版本。 :D 修复部署脚本后,一切正常工作

最佳答案

此问题已在 SignalR 的下一版本中修复。问题的原因是多次调用start导致延迟对象立即解析。

我将如何解决您的问题(如果您不想等待下一个版本)将在您的代理对象中,我将更改连接起始行:

$.connection.hub.stateChanged(function(state) {
    // Transitioning from connecting to connected
    if(state.oldState === $.signalR.connectionState.connecting && state.newState === $.signalR.connectionState.connected) {
        // Start sending
    }
});

$.connection.hub.start();

这样,您就可以保护您的库免受名为“starts”的用户的影响,并且仅在连接时才开始发送。

关于SignalR 完成事件触发得太快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17086124/

相关文章:

c# - 客户端何时适合与 SignalR 服务重新协商?

c# - SignalR 连接线程与 Android

c# - 如何将 SignalR hub 上下文传递到 ASP .NET Core 2.1 上的 Hangfire 作业?

SignalR:在同一网站上传/下载文件之前没有消息传递

signalr - signalR 不起作用的简单示例

SignalR - 如何使用 hubproxy 从客户端调用带有参数的服务器函数

c# - SignalR - 异常传播到客户端

asp.net-mvc - SignalR with Firefox 在控制台中显示 XML 解析错误

c# - SignalR 和 Redis : SocketFailure on EVAL

javascript - Windows 10 32 位上的 Edge 阻止对本地主机的 ajax 调用,网络错误 0x2efd