2011-11-20 72 views
0

我搜索了谷歌,SignalR wiki和SignalR代碼本身(例如,廣播功能,Signaler等),並且什麼也沒找到。SignalR:獲取PersistentConnection的客戶列表

我寫了ClientIDFactory併成功將ClientID設置爲UserID。 它的工作原理,但現在用戶無法連接多個瀏覽器/選項卡。

我修改了函數,並向用戶標識添加了隨機字符串。有用。

現在我需要找到一種方法來獲取用戶的所有連接,將特定的消息發送到特定的用戶ID。

我想各地的客戶名單循環,並找到string.split()的用戶名,但其他方面可能是有用的。

我沒有使用Hub。只有PersistentConnection。

謝謝,

+1

爲什麼你需要一個客戶列表?當你建立一個新的連接時,你不能跟蹤你的集線器中的那個列表。 – davidfowl

+0

我沒有使用集線器。我無法使用OnConnectedAsync/OnConnected並跟蹤自己,因爲在IIS AppPool回收(例如 - 代碼更改)時,用戶與舊會話的cookie「連接」,不會觸發此事件。 (並感謝所有人) –

+0

無論哪種方式,你都需要自己跟蹤。客戶可以在另一臺機器上,並且仍然可以收到通知。它實際上是底層消息存儲和信號總線的實現細節。 – davidfowl

回答

1

我認爲你的做法是不正確的,因此這已浮出水面。您已連接並斷開服務器端的連接方法以掛鉤。在連接上,您需要堅持與某些元數據的連接,然後即使服務器重新啓動,您也可以檢查唯一用戶或唯一客戶端的元數據,並使用新ID重新連接它們。

例如

  1. 如果你是買來自移動一個項目,您尚未登錄(沒有元數據涉及到用戶),你將在你的籃子2項。當你走進你的桌面時,你不會看到籃子裏的這兩件物品,因爲服務器不能與你來自同一臺機器的同一用戶。
  2. 如果您已登錄(元數據,如附加到當前連接ID的電子郵件或用戶名),並且您從移動設備上瀏覽並在購物籃中添加2個項目。當你登錄到你的桌面時(新的連接ID可以被鏈接到相同的元數據電子郵件或用戶ID),然後你可以告訴它的同一個用戶。如果您需要向該用戶發送消息,則必須將其發送給兩個客戶ID,您可以通過將其分組或將其發送給兩個ID來完成。

如果客戶端丟失了連接ID,它應該斷開連接,並且在新的連接上它將有新的連接ID,因此您應該考慮映射它們。 如果我連接來自7個不同手機的7個ID,只要您的系統知道他們都是此通知的預定接收者,通知就會發送到所有7個手機。堅持這種知識的實施不是signalR的一部分,因此您必須自己實施。