2012-07-11 112 views
3

使用SignalR集線器客戶端可以從組中添加或刪除。一個客戶可以屬於多個組。是否有可能從當前所屬的每個組中刪除客戶端?我想我正在尋找的是類似於Clients[*allgroups*].leave(Context.ConnectionId)SignalR - 離開所有組

回答

1

看起來他們還沒有實現這一點,但它被認爲是V3的候選人。用下面的代碼的特性請求存在於https://github.com/SignalR/SignalR/issues/66

public static class SignalRConnectionToGroupsMap 
{ 
    private static readonly ConcurrentDictionary<string, List<string>> Map = new ConcurrentDictionary<string, List<string>>(); 

    public static bool TryAddGroup(string connectionId, string groupName) 
    { 
     List<string> groups; 

     if (!Map.TryGetValue(connectionId, out groups)) 
     { 
      return Map.TryAdd(connectionId, new List<string>() {groupName}); 
     } 

     if (!groups.Contains(groupName)) 
     { 
      groups.Add(groupName); 
     } 

     return true; 
    } 

    // since for this use case we will only want to get the List of group names 
    // when we're removing the mapping - we might as well remove the mapping while 
    // we're grabbing the List 
    public static bool TryRemoveConnection(string connectionId, out List<string> result) 
    { 
     return Map.TryRemove(connectionId, out result); 
    } 
} 
4

從v0.5.2開始,無法離開所有組,因爲服務器不跟蹤客戶端所屬的組。您需要自己完成此操作,並逐個從每個組中刪除客戶端。

有在但積壓類似的請求,那麼也許這將在未來的版本中實現:https://github.com/SignalR/SignalR/issues/66

+0

那麼如何'客戶端[「組名」]。WhateverMethod()'知道只有將消息發送到在「組名」客戶端? – EkoostikMartin 2012-08-28 22:06:20

+1

SignalR連接(從服務器到客戶端的通道)正在偵聽特定消息或「信號」,例如連接ID或組名,它們通過查詢字符串進行循環。用作背板的消息總線(以簡化形式)僅僅是一個使用此信息作爲密鑰的字典,當您調用客戶端方法時,它只是將「WhateverMethod」作爲值放入字典中。然後,所有監聽該密鑰的連接都將被異步地提供給數據。離開所有的團體需要一個特殊的命令,告訴客戶停止聆聽,而這還不是。 – 2012-08-29 17:09:49

+0

我明白了,謝謝你的解釋! – EkoostikMartin 2012-08-29 17:56:22