我正在努力适应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);
};
});
答案 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);