在start()。done()之后SignalR并不总是准备就绪?

时间:2013-03-07 19:02:06

标签: asp.net signalr

我有一个与SignalR合作的小项目,但是我的行为非常不稳定。

<script type="text/javascript">
    $(function () {
        var chat = $.connection.brewBattleHub;
        $.connection.hub.start().done(function () {
            $("#broadcast").click(function () {
                // Call the chat method on the server
                chat.server.roll($("#username").val(), $("#drinkname").val());
            });
            chat.server.sendMessage("SignalR loaded...");
        });
    });
</script>

当我加载页面时,有时我看到消息“SignalR loaded”,有时我不是。

页面上还有一些其他功能,有时这也不起作用。如果我点击按钮并让事情发生得足够的话,它最终会一次性完成......从这一点来说,这一切都是金色的,并且完美无瑕。

start().done()吗?不确保它已准备就绪?

=== 附录,我没有引用jquery mobile(谷歌提到这样做时有一个错误)

3 个答案:

答案 0 :(得分:11)

本周我遇到了类似的问题,但.done()中的代码从未运行过。我启用了日志记录,没有记录任何内容。检查浏览器的控制台没有错误。查看浏览器的开发工具,我可以看到在调用start()时没有网络活动。我确认$ .connection.myhubclass返回的代理有我所有的方法,所以我知道它可以与服务器通信,服务器端代码设置正确。

在一遍又一遍地审查代码和文档后,我确信我没有做错任何事。 SignalR非常简单,如果你按照例子做错,那就很难做错了。我试着想出这个问题,在桌子上打了很长时间。

然后我注意到如果我从控制台运行SignalR的启动方法就可以了。这让我相信它试图过早地开始连接。我通过更改初始化代码解决了我的问题:

$.connection.hub.start().done(function () {
  //Do interesting stuff
});

对此:

setTimeout(function () {
    $.connection.hub.start().done(function () {
      //Do interesting stuff
    });
}, 5000);

我确信我可以将延迟从5秒减少到更短的时间,但额外的时间似乎是让浏览器准备好创建连接所需的时间。一旦该延迟在那里,日志开始工作,连接就出现了,服务器端OnConnected()运行并且在客户端上运行了done()。

在搞清楚之后,我仔细检查了我的javascript加载的顺序,想到也许我正在加载无序的东西,但顺序是根据SignalR样本的顺序。我加载了jQuery,SignalR,/ signalr / hubs,然后加载了初始化所有内容的脚本文件。

我愿意接受为何需要延迟的建议。我没有在任何文档中看到它所以我知道它可能是我做的事情。幸运的是,对于这个页面,启动SignalR之前的一个小延迟不是问题。

答案 1 :(得分:9)

尝试启用SignalR日志记录以帮助调试您的问题。您可能还想添加fail处理程序,以防启动未成功(尽管这不太可能)。完成此操作后,您可以浏览浏览器的F12工具,查看JS和网络日志。

<script type="text/javascript">
    $(function () {
        $.connection.hub.logging = true;
        var chat = $.connection.brewBattleHub;
        $.connection.hub.start().done(function () {
            $("#broadcast").click(function () {
                // Call the chat method on the server
                chat.server.roll($("#username").val(), $("#drinkname").val());
            });
            chat.server.sendMessage("SignalR loaded...");
        }).fail(function (reason) {
            console.log("SignalR connection failed: " + reason);
        });
    });
</script>

答案 2 :(得分:3)

我找到了一个解决方案(就我的问题而言)。 我在IE11上将SignalR加载了大约7-8秒,我试图在控制台中“调试”它并且我找到了加载延迟的原因:

  

[13:13:04 GMT + 0200(...)] SignalR:绑定到iframe的加载事件。
  [13:13:09 GMT + 0200(...)] SignalR:foreverFrame尝试连接时超时。
  [13:13:09 GMT + 0200(...)] SignalR:永远停止帧。

耗时5秒。尝试加载iframe。

整洁的解决方案是关闭iframe,因为IE11通常可以使用longPolling:

$.connection.hub.start(({ transport: ['webSockets', 'serverSentEvents', 'longPolling'] }))