2014-05-24 46 views
2

我有一個SignalR集線器,它正在向網頁中的Javascript客戶端推送一些數字增量(和遞減)。 ASP.NET MVC頁面最初從數據庫中提取初始值,然後SignalR開始執行。通常會調用這些方法,但有些方法會丟失。例如: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); 
    } 

我的客戶(S)是在該stats組中註冊/。我嘗試過使用不同的瀏覽器和不同的操作系統,它們的行爲完全相同。我檢查了終身事件,並且沒有連接減速,斷開連接,重新連接。我使用websockets傳輸連接,並且連接到Internet和服務器都非常穩定。爲什麼我的數值偏離了大約50%,我該如何糾正這種行爲?

+0

請考慮天堂:https://jabbr.net/#/rooms/signalr –

+0

我沒有看到你已經證明可以解釋這一代碼什麼;我建議嘗試創建一個最小的例子來重現問題;也許你的數據參數並不總是你所期待的 –

+0

@LarsHöppner甚至沒有參數。 SignalR只是RPC客戶端上的增量或減量方法。 –

回答

1

請記住,從signalr中檢索數據是一種異步操作。儘管Javascript是單線程的,但不能確定在另一個請求從html元素中選取相同的數字之前,拾取的數字會遞增。也許可以擴展你的日誌方法來查看HTML元素中實際選取的數字。

但是,每分鐘100個增量應該是可行的。我建議訂閱終身事件並查看連接狀態。也許連接速度很慢或需要經常重新連接。

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

+0

我已訂閱所有事件(連接,重新連接,斷開連接,連接速度較慢),但一切看起來非常穩定。我處於一個穩定的良好Internet連接,使用websockets連接到我的服務器,而且我的站點也很穩定。我不知道爲什麼我沒有得到一些增量。 –

+0

您是否還擴展了日誌以查看選擇了哪個數字?可能的是,請求從html元素中選擇數字60,並且在它可以將其遞增到61之前,另一個請求進入並且選擇數字60。接下來會發生的事情是,第一個請求將其數字遞增爲61,並將其寫回到html元素中,第二個請求將其數量遞增到61,並將其寫回到html元素。那將是一種情況,你已經「失去」了一個遞增的請求。 – Schadensbegrenzer

+0

我真的懷疑這是問題所在。我正在記錄來自服務器的所有請求,並且我沒有看到任何連續的請求快速進入。我還有一些其他領域,當它們應該增加時,它們不會增加。 –