2012-07-17 34 views
4

我已經創建了自己的IConnectionIdGenerator實現這對於我的web表單應用程序名稱simpicty客戶端連接ID進行登錄驗證用戶的EmailAddress.ToLower()(如果這是不可用,則它默認返回一個GUID)。 從我的頁面代碼調用客戶端後面的所有工作正常。SignalR如何處理重複的連接ID?

hubContext.Clients[LoggedInUser.EmailAddress.ToLower()].updateProgress(i) 

但是看來,如果我打開另一個瀏覽器或標籤與登錄用戶相同的兩個在Windows的foreverframe連接不斷給一個301的結果,那麼200結果交替和重複。

我認爲分配相同的連接ID只給我一個簡單的方法,以確保正確的信息去系統的正確的用戶,無論他們連接在哪裏。

他們總是必須是獨一無二的,我將不得不建立另一層來管理登錄用戶帳戶的連接,或者我錯過了一個詭計嗎?

回答

3

連接ID必須是唯一的。如果你沒有使它們獨一無二,那麼你就會脫機地連接另一個連接。在內部,我們使用連接ID作爲連接的唯一標識符,並且我們斷開了dupes。

如果你被重複301升的反應很可能是因爲你有你的應用程序稱爲signalr一個文件夾,它是沒有直接關係的共享連接ID。

2

我最近試圖做同樣經歷了同樣的問題,所以我的結論是,連接ID必須是唯一的,否則一切都開始出現故障反覆301級200的響應。

我做的事,以解決此問題是使用默認的GUID連接ID,而是開始連接後加入到這是由我自己的ID(電子郵件地址,你的情況)發現了一組連接。 這樣我可以撥打Clients[emailAddress].doSomething(),它會廣播到此用戶的所有打開的標籤。

+0

但是你失去了使用'AllExcept()'的能力,它從外觀上不支持組。 – georgiosd 2012-12-20 11:26:32

0

是的,這是完美的,我來到了一個類似的結論。

我也試圖想辦法讓客戶端廣播消息特有的當前URL(這樣一個頁面上的進度條不還更新另一個進度條)

相同的電子郵件地址組我要麼擴展組ID爲emailAddress + currentURL,所以它只是兩個字符串的組合。但是,除非有辦法獲取羣組收集和解析電子郵件地址並將郵件發送到每個電子郵件地址+ URL組合,否則這將使任何全球站點廣播(對所有URL)難以做到。

這可能是更好的,如果我只是標籤上的一些客戶端檢查和發送進度條的ID作爲參數,其特有的精神疾病是要更新頁面上的進度條。