SignalR有时不会调用客户端方法

时间:2014-05-24 11:48:02

标签: javascript asp.net signalr

我有一个SignalR中心,它正在向网页中的Javascript客户端推送一些数字增量(和减量)。 ASP.NET MVC页面最初从数据库中提取初始值,然后SignalR启动。这些方法通常被调用,但有些方法会丢失。例如:

  • x的初始值为100000。
  • 服务器一般每分钟增加约100次。
  • x的值在客户端增加了大约50-60次,所以说x变为100055。
  • 当我刷新页面时,从数据库中提取x,它的实际值为100100.

集线器代码非常简单,我在数据来自服务器时进行日志记录:

$(function () {
    var connection = $.connection.adminhub;
    var myToken = "@ViewBag.Code";

    connection.client.increment = function (data) {
        console.log("SignalR: increment " + data);
        var num = parseInt($("#" + data).text());
        $("#" + data).text(num + 1);
    };

    connection.client.decrement = function (data) {
        console.log("SignalR: decrement " + data);
        var num = parseInt($("#" + data).text());
        $("#" + data).text(num - 1);
    };
    console.log("Connecting to SignalR...");
    $.connection.hub.start().done(function () {
        console.log("Connected to SignalR.");
        connection.server.registerForIndex(myToken);
    });

});

ViewBag.Code是由服务器编写的特殊标记,它可以工作(否则它无法接收任何数据)。服务器上只有一个地方调用了集线器的方法:

    static IHubContext Instance{
        get
        {
            return GlobalHost.ConnectionManager.GetHubContext<AdminHub>();
        }
    }

    public static void Increment(string key)
    {
        Instance.Clients.Group("stats").increment(key);
    }

我的客户已在stats群组中注册。我尝试过不同的浏览器和不同的操作系统,它们的行为完全相同。我检查了生命周期事件,没有连接减速,断开连接,重新连接。我使用websockets传输连接,我与Internet和服务器的连接非常稳定。为什么我的价值下降了约50%,我该如何纠正这种行为呢?

1 个答案:

答案 0 :(得分:1)

请记住,从signalr检索数据是一种异步操作。尽管Javascript是单线程的,但是在另一个请求从html元素中选择相同的数字之前,您无法确定所选数字是否会增加。可能会扩展您的日志方法,以查看从HTML元素中实际选取的数字。

但是,每分钟100次增量应该是可行的。我建议订阅生命周期事件并查看连接状态。也许连接速度很慢或需要经常重新连接。

http://www.asp.net/signalr/overview/signalr-20/hubs-api/hubs-api-guide-net-client#connectionlifetime