2015-10-09 28 views
1

我正在從事在線用戶列表。我的代碼是:防止在線用戶列表信號中的重複用戶

public class User 
    { 
     public string id; 
     public string name; 
     public string dpExtension; 
    } 
    public class OnlineUsers : Hub 
    { 
     private Entities db = new Entities(); 
     public static ConcurrentDictionary<string, User> users = new ConcurrentDictionary<string, User>(); 
     public override System.Threading.Tasks.Task OnConnected() 
     { 
      User u = new User(); 
      u.id = "visitor"; 
      u.name = "Visitor"; 
      u.dpExtension = ""; 
      if (Context.User.Identity.IsAuthenticated) 
      { 
       u.id = Context.User.Identity.GetUserId(); 
       var da = db.AspNetUsers.Find(u.id); 
       u.name = da.Email; 
       u.dpExtension = da.dpExtension; 
      } 
      User abc; 
      var data = users.TryGetValue(Context.ConnectionId, out abc); 
      if (!data) 
      { 
       users.TryAdd(Context.ConnectionId, u); 
      } 
      Clients.All.showConnected(users); 
      return base.OnConnected(); 
     } 
     public override System.Threading.Tasks.Task OnDisconnected(bool stopCalled) 
     { 
      User abc; 
      users.TryRemove(Context.ConnectionId, out abc); 
      Clients.All.showConnected(users); 
      return base.OnDisconnected(stopCalled); 
     } 
    } 

現在,如果用戶打開了一個瀏覽器選項卡,它會在列表中顯示一次,這很好。但是,如果用戶打開兩個選項卡,它將在列表中顯示兩次。如何在列表中只顯示一個用戶一次?

回答

0

您需要將ConnectionIds映射到一個用戶。您可以在這篇文章中閱讀很多內容 - http://www.asp.net/signalr/overview/guide-to-the-api/mapping-users-to-connections

我已經在你的代碼中添加幾件事情,你可以看到發生了什麼事情在這篇文章中:

public class User 
{ 
    public string dpExtension; 
    public string id; 
    public string name; 
} 

public class Map 
{ 
    public string UserId { get; set; } 
    public User User { get; set; } 
    public List<string> Connections { get; set; } 
} 

public class OnlineUsers : Hub 
{ 
    public static readonly List<Map> maps = new List<Map>(); 
    private readonly Entities db = new Entities(); 

    public override Task OnConnected() 
    { 
     var user = new User { id = "visitor", name = "Visitor", dpExtension = "" }; 

     if (Context.User.Identity.IsAuthenticated) 
     { 
      user.id = Context.User.Identity.GetUserId(); 
      var da = db.AspNetUsers.Find(user.id); 
      user.name = da.Email; 
      user.dpExtension = da.dpExtension; 
     } 

     Map data = maps.FirstOrDefault(t => t.UserId == user.id); 
     if (data == null) 
     { 
      maps.Add(new Map() { 
       UserId = user.id, 
       User = user, 
       Connections = new List<string>() { Context.ConnectionId } 
      }); 
     } 
     else 
     { 
      data.Connections.Add(Context.ConnectionId); 
     } 

     Clients.All.showConnected(maps.Select(m => m.User)); 
     return base.OnConnected(); 
    } 

    public override System.Threading.Tasks.Task OnDisconnected(bool stopCalled) 
    { 
     var map = maps.FirstOrDefault(t => t.Connections.Contains(Context.ConnectionId)); 
     if (map != null) 
     { 
      map.Connections.Remove(Context.ConnectionId); 
      if (map.Connections.Count <= 0) 
      { 
       maps.Remove(map); 
      } 
     } 

     Clients.All.showConnected(maps.Select(m => m.User)); 
     return base.OnDisconnected(stopCalled); 
    } 
} 
+0

什麼是'Map'命名空間? –

+0

你寫過這個課程 –

+0

得到它。謝謝 ! –