2014-03-27 29 views
0

我被指向David Fowler自己的GITHub sample代碼來跟蹤SignalR用戶和狀態。我已經實現了它的全部功能,除非我無法弄清楚集線器連接狀態變化的顯示,否則它工作的很好。我有這似乎沒有工作。有誰知道爲什麼?如何跟蹤SignalR連接狀態?

!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
    <title></title> 
    <style> 
     #state { 
      width: 20px; 
      height: 50px; 
     } 
    </style> 
</head> 
<body> 
    <h3 id="msg"></h3> 
    <div id="state"></div> 

    <script src="../Scripts/jquery-1.10.2.min.js"></script> 
    <script src="../Scripts/jquery.signalR-2.0.2.min.js"></script> 
    <script src="signalr/hubs"></script> 
    <script> 

     $(function() { 
      var userTracking = $.connection.alphaHub; 

      // Need at least one callback for events to be raised on the hub 
      userTracking.client.void = function() { }; 
      $.connection.logging = true; 

      $.connection.hub.stateChanged(function (change) { 
       if (change.newState === $.signalR.connectionState.connected) { 
        $('#state').css('background-color', 'green'); 
       } else if (change.newState === $.signalR.connectionState.reconnecting) { 
        $('#state').css('background-color', 'yellow'); 
       } else if (change.newState === $.signalR.connectionState.disconnected) { 
        $('#state').css('background-color', 'red'); 
       } 

      }); 

      $.connection.hub.disconnected(function() { 
       setTimeout(function() { 
        $.connection.hub.start(); 
       }, 1000); 
      }); 
     }); 
    </script> 
</body> 
</html> 

我中心顯示部分在這裏:

public class AlphaHub : Hub 
    { 
public override async Task OnConnected() 
     { 
      try 
      { 
       var name = Context.User.Identity.Name; 

       using (savitasEntities2 entities = new savitasEntities2()) 
       { 
        var user = entities.SUsers 
         .Include(u => u.SConnections) 
         .SingleOrDefault(u => u.UserName == name); 

        if (user == null) 
        { 
         user = new SUser 
         { 
          UserName = name, 
          SConnections = new List<SConnection>() 
         }; 
         entities.SUsers.Add(user); 
        } 

        user.SConnections.Add(new SConnection 
        { 
         ConnectionID = Context.ConnectionId, 
         UserAgent = Context.Request.Headers["User-Agent"], 
         LastActivity = DateTimeOffset.UtcNow 
        }); 
        // entities.SaveChanges(); 
        await entities.SaveChangesAsync(); 
       } 

      } 

public override async Task OnDisconnected() 
     { 
      try 
      { 
       using (savitasEntities2 db = new savitasEntities2()) 
       { 
        var connection = await db.SConnections.FindAsync(Context.ConnectionId); 
        db.SConnections.Remove(connection); 
        await db.SaveChangesAsync(); 
       } 
      } 
      catch (Exception ex) 
      { 
       c.LogError(ex.Message, "AlphaHub.cs" + " - " + this.GetType().FullName + "." + System.Reflection.MethodBase.GetCurrentMethod().Name); 
      } 
     } 
+0

你有什麼是不工作的詳細信息? JavaScript控制檯中的任何錯誤?在集線器上是否觸發了OnConnected()和OnDisconnected()方法?是否正在執行hub.stateChanged回調? –

+0

感謝您的回覆。我得到SCRIPT5007:無法在控制檯中獲取未定義或空引用的屬性'client',因此它不能連接到Hub $ .connection.alphaHub; – user2471435

+0

我需要像[HubName(「userTracking」)]一樣添加[HubName(「alphaHub」)]嗎?我認爲JavaScript中的默認是使用camelCase? – user2471435

回答

0

看起來像你的集線器不能被發現。

變化:

<script src="signalr/hubs"></script> 

到:

<script src="~/signalr/hubs"></script>