在完整的ajax导航网页中使用SignalR?

时间:2014-08-18 13:55:57

标签: javascript jquery ajax signalr

我正在努力适应SignalR。 但我需要一个金点来完全理解它。我觉得距离抢夺只有一步......

我的代码:

使用Javascript:

            $(function() {
                var connection = $.connection.signalR;

                connection.client.broadcastTotalOnline = function (totalOnlineUser) {
                    $('#TotalOnline').html(totalOnlineUser);
                };

                $.connection.hub.start().done(function() {
                    console.log("Connection Started!");
                });
            });

C#:

public class SignalR : Hub
{
    public void SendTotalOnline()
    {
        var context = GlobalHost.ConnectionManager.GetHubContext<SignalR>();
        using (var dbContextx = new db_Oyun())
        {
            while (true)
            {
                int totalOnlineUser = dbContextx.tbl_User.Count(x => x.Online);
                context.Clients.All.broadcastTotalOnline(totalOnlineUser);
                Thread.Sleep(1000);
            }
        }
    }
}

上面的代码是完美的,但是当我用AJAX将新页面调用到内部内容时。 然后我想使用相同的集线器,相同的对象和相同的集线器,不同的对象。它不起作用。不叫警报;但当我删除上面的signalR代码时,代码正常工作。

        $(function () {
            var connection = $.connection.signalR;
            connection.client.broadcastTotalOnline = function (totalOnlineUser) {
                alert(totalOnlineUser);
            };
        });

1 个答案:

答案 0 :(得分:0)

当您启动SignalR连接时,它会检查$.connection.signalR.client对象以查看您是否添加了任何回调。如果在连接开始后使用正常分配添加回调,则SignalR将不会接收该回调。

要在连接开始后添加回调,您可以使用$.connection.signalR.client.on

$.connection.signalR.client.on("broadcastTotalOnline", function (totalOnlineUser) {
    alert(totalOnlineUser);
});

如果您尝试向Hub添加回调,那么在开始连接之前您还没有回调,那么即使使用.on也无效。

在启动连接之前,您必须至少有一个回调连接到您计划使用的每个集线器。您设置的回调可以是从不调用的虚拟回调。添加回调只是向SignalR指示您对来自该集线器的消息感兴趣。

由于您在开始连接之前已经附加到broadcastTotalOnline,因此您无需在案例中添加任何虚拟回调。

如果您要删除回调,可以使用$.connection.signalR.client.off并引用之前添加的功能:

var callback = function (totalOnlineUser) {
    alert(totalOnlineUser);
};

$.connection.signalR.client.on("broadcastTotalOnline", callback);
$.connection.signalR.client.off("broadcastTotalOnline", callback);