【问题标题】:SignalR sometimes not calling the client methodsSignalR 有时不调用客户端方法
【发布时间】:2014-05-24 11:48:02
【问题描述】:

我有一个 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是服务器写的特殊令牌,它可以工作(否则它不能接收任何数据)。服务器上只有一个地方调用了hub的方法:

    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%,我该如何纠正这种行为?

【问题讨论】:

  • 请考虑天堂:jabbr.net/#/rooms/signalr
  • 我在您展示的代码中看不到任何可以解释这一点的内容;我建议尝试创建一个最小的示例来重现该问题;也许您的数据参数并不总是您所期望的
  • @LarsHöppner 甚至没有参数。 SignalR 只是 JS 客户端上的 RPC 递增或递减方法。
  • @RoyiNamir 我无法使用 Facebook 登录,登录机制已损坏。
  • 在您的代码示例中,您使用 data/key 参数来选择 DOM 元素,这就是我的意思;我尝试了一个简单版本的你正在做的事情,每秒 2 条消息,它按预期工作(v2.0.3),所以我想说你正在做的事情的某些方面不是问题;问题:您是否将日志语句的数量与您期望的调用数量进行了比较?它发生在一个客户身上吗? SignalR 版本?

标签: javascript asp.net signalr


【解决方案1】:

请记住,从信号器检索数据是异步操作。即使 Javascript 是单线程的,您也不能确定在另一个请求从 html 元素中选择相同的数字之前,选择的数字会增加。也许扩展您的日志方法以查看实际从 HTML 元素中选择的数字。

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

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

【讨论】:

  • 我订阅了所有事件(连接、重新连接、断开连接、连接缓慢),但一切看起来都非常稳定。我的互联网连接良好,稳定,使用 websockets 连接到我的服务器,我的网站也很稳定。我不知道为什么我没有得到一些增量。
  • 您是否也扩展了日志以查看选择了哪个号码?可能是一个请求正在从 html 元素中选择数字 60,并且在它可以将其增加到 61 之前,另一个请求正在进来并选择数字 60。然后发生的情况是,第一个请求将其编号增加到 61 并将其写回 html 元素,第二个请求也将其编号增加到 61,并将其写回 html 元素。在这种情况下,您“丢失”了一个递增的请求。
  • 我真的怀疑这是问题所在。我正在记录来自服务器的所有请求,但我没有看到任何连续的请求快速到来。我还有一些其他字段在它们应该递增时根本不递增。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-13
  • 1970-01-01
  • 1970-01-01
  • 2018-04-30
相关资源
最近更新 更多