javascript - SignalR 有时不调用客户端方法

标签 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 是服务器写的一个特殊的token,它起作用了(否则接收不到任何数据)。服务器上只有一个地方调用了 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%,我该如何纠正这种行为?

最佳答案

请记住,从 signalr 检索数据是一个异步操作。即使 Javascript 是单线程的,您也无法确保在另一个请求从 html 元素中选择相同的数字之前,选择的数字会递增。也许扩展您的日志方法以查看实际从 HTML 元素中选取了哪些数字。

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

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

关于javascript - SignalR 有时不调用客户端方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23844651/

相关文章:

javascript - 理解 Complex inArray 三元运算符

javascript - 拖动比例尺作为组

c# - 无法在 ASP.NET MVC 中加载同一库的两个版本

ios - SignalR-ObjC 不调用服务器调用

.net - SignalR 中的多态性

javascript - 访问函数 javascript

javascript - sleep() 的 JavaScript 版本是什么?

c# - 使用 Amazon API for .NET 设置内容编码和内容类型

asp.net - 如何使用 Ajax 和 ASP.NET WebMethod 传递 JSON 对象

c# - 在 ASP.NET Web 应用程序中使用静态字典