2012-12-31 69 views
0

即使在頁面刷新時,我仍想保持連接ID。 我在客戶端保存一個cookie,而是試圖找回它時,該 request.Cookies.Count爲0SignalR connectionID

這是實現接口:

public class ConnectionFactory : IConnectionIdPrefixGenerator 
{ 
    public string GenerateConnectionIdPrefix(IRequest request) 
    { 
     if (request.Cookies["signalrconnid"] != null) 
     { 
      return request.Cookies["signalrconnid"].Value; 
     } 

     return Guid.NewGuid().ToString(); 
    } 
} 

這是從開始叫()函數:

GlobalHost.DependencyResolver.Register(typeof(IConnectionIdPrefixGenerator),() => new ConnectionFactory()); 

這是在客戶端:

function setCookie(cName, value, exdays) { 
    var exdate = new Date(2013,1,1,0,0,0,0); 
    var c_value = escape(value) + ((exdays == null) ? "" : "; expires=" + exdate.toUTCString()); 
    document.cookie = cName + "=" + c_value; 
} 

(不介意日期)

我看了不少文章,但我沒有得到什麼區別。

+1

我之前沒有使用過SignalR,所以爲什麼要記住請求之間的連接ID而不是每次都生成一個新的guid? –

+0

因爲我有一些基於該connectionID的邏輯。也就是說,每個客戶端都通過其ConnectionID進行識別,因此每次頁面刷新/客戶端轉到網站中的其他頁面時,我都無法擁有「新」客戶端。 – user1919071

+0

爲什麼不簡單地創建連接ID和用戶之間的映射並跟蹤連接和斷開連接以維護映射。這就是我們的應用程序所做的。 – Pete

回答

3

正如@Chris Moutray指出的那樣,最好不要以這種方式使用ConnectionId。如果我在你的鞋子裏,我會在客戶端創建一個SessionId,將它存儲在一個cookie或session storage中,傳遞sessionId而不是connectionId,然後用它作爲長期會話和短期會話之間的適當映射連接。 (使用UserId作爲映射的問題是,用戶可以同時在多個位置登錄)。

+0

我可以做到這一點,但比我如何處理這些小組?只有使用Context.ConnectionID才能添加。如果每次客戶端在頁面間移動時都改變,我將不得不重新註冊他。 – user1919071

+1

這可能是正確的,也是爲什麼我不使用SignalR中的組功能的原因之一。據我所知,關於誰得到什麼消息的邏輯通常比SignalR組的功能可以處理的更復雜。所以我通常最終會在我稱之爲「會話」(可以在多個連接中持續)和SignalR連接之間保持映射關係;和我自己的「團體」(我稱之爲房間)是一組會話,而不是連接。據我所知,SignalR組是簡單場景的一種便利功能;而你的不是。 –

+0

謝謝,標記爲已回答! – user1919071

相關問題