2016-11-21 29 views
1

所以我使用signalR來讓在線用戶列表。 我以前stopCalled避免頁面刷新會像斷線,但現在的用戶是永遠不會斷..只有在用戶關閉頁面/標籤後,SignalR纔會打開OnDisconnect

public override Task OnDisconnected(bool stopCalled) 
{ 
    var manager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext())); 
    var currentUser = manager.FindByName(Context.User.Identity.Name); 
    string name = currentUser.NickName; 
    if (!(stopCalled)) 
    { 
     var item = users.SingleOrDefault(x => x.Nick == name); 
     if (item != null) 
      users.Remove(item); 
     userNames.Remove(name); 
     Clients.All.hubReceived(users); 
    }  
    return base.OnDisconnected(stopCalled); 
} 

按鈕點擊時,用戶應該只僅斷(註銷按鈕) 或當他的閉幕該標籤/頁面。 我能做些什麼?

回答

0

stopCalled指示客戶端disconnected gracefully or not,所以您當前的方法將只刪除那些連接消失的用戶(例如:網絡丟棄)。

對於所有在線用戶的列表,計數每個用戶的連接數。

OnConnected

  • 如果用戶沒有在列表中找到,添加具有count = 1
  • 用戶如果用戶在列表中,增加計數

OnDisconnected

  • 減少計數爲用戶
  • 如果該用戶count = 0,從列表中
+0

因此,我試圖按照你說的做,但它不工作,因爲回發導致計數下降到0,從列表中刪除,然後再次連接..所以用戶從0閃爍「1」當提神時,這是我的問題:/ –

+0

好的。在這種情況下,也可以使用'OnConnected'和'OnReconnected'中更新的'LastConnected'時間戳。在'OnDisconnected'中,如果計數爲零,則不要刪除用戶。實現一個自動作業,每運行'x分鐘',用'count = 0'和'LastConnected'去除'x分鐘前'的用戶。使用自動作業調度程序來執行此操作,如[FluentScheduler](https://github.com/fluentscheduler/FluentScheduler) –

+0

或者更容易,在刷新當前用戶時添加一點延遲,所以它不會閃爍 –

0

刪除用戶如果用戶在線,所以它不會不管經歷多少窗口已經打開。 你應該通過他們的連接跟蹤在線用戶in database

如果用戶刷新窗口,您創建一個新的連接,所以以前的連接最終會斷開連接。

就像這樣,我試着猜你應該編碼。

你應該在你的數據庫OnlineUser創建一個表ConnectionId列和UserId

public override Task OnConnected() 
{ 
    var onlineUserManager = NewOnlineUserManager<OnlineUser>(new OnlineUserStore<OnlineUser>(new ApplicationDbContext())); 
    var onlineUser = onlineUserManager.FindByConnectionId(Context.ConnectionId); 

    if (onlineUser == null) 
    { 
     var manager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext())); 
     var currentUser = manager.FindByName(Context.User.Identity.Name); 

     onlineUser = new OnlineUser 
     { 
      ConnectionId = Context.ConnectionId, 
      UserId = currentUser.Id 
     }; 

     onlineUserManager.Save(onlineUser); 
    } 

    return base.OnConnected(); 
} 

public override Task OnDisconnected(bool stopCalled) 
{ 
    if (stopCalled) 
    { 
     var onlineUserManager = NewOnlineUserManager<OnlineUser>(new OnlineUserStore<OnlineUser>(new ApplicationDbContext())); 
     var onlineUser = onlineUserManager.FindByConnectionId(Context.ConnectionId); 

     if (onlineUser != null) 
     { 
      onlineUserManager.Remove(onlineUser); 
     } 
    } 

    return base.OnDisconnected(stopCalled); 
} 

您可能需要做出一些改變,以支持一個用戶的多個連接。