在全ajax导航网页中使用SignalR

Using SignalR in full ajax navigated web pages?

本文关键字:SignalR 网页 ajax 导航 在全      更新时间:2023-09-26

我正在努力适应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的内部内容。然后我想用同样的中心,同样的物体同样的中心,不同的物体。它不工作。不调用alert;但是当我删除上面的信号r代码时,在代码下工作。

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

当您启动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);