2012-09-18 44 views
16

我明白爲什麼SignalR不會給你access to the HttpContext。但是,這對我們來說是相當成問題的。讓我解釋一下:SignalR和HttpContext/Session

我們的應用程序是一個多租戶應用程序,用戶在登錄時選擇環境。這基本上是將ConnectionStringName註冊到HttpSession中。在我們的SignalR Hub中,我們需要訪問Disconnect上的數據庫。但是這是不可能的,因爲在這一點上我們沒有HttpContext,並且不能確定要寫入的環境。

任何人都可以提供一個建議如何解決這個問題?我們有點卡在這一個。

編輯:如果您的解決方案在負載平衡環境中工作,則爲獎勵點。

+0

您還在尋找解決方案嗎? –

+0

我們以完全不同的方式實現了該功能。 – Lodewijk

+1

@Lodewijk,你可以分享你的不同方式嗎?我處於同樣的情況。 –

回答

0

您可以使用像Dictionary這樣的東西來跟蹤連接時用戶的ConnectionId。同樣使用SQL Server存儲會話狀態也可能有所幫助:http://support.microsoft.com/kb/317604

SignalR確實爲您提供了訪問User.Identity.Name的權限,您可以使用它來跟蹤何時觸發disoconnect()。

+0

不幸的是,用戶信息不可用:「..以及HubContext的用戶和Cookie不會被填充。」 (https://github.com/SignalR/SignalR/wiki/Hubs) – Lodewijk

+0

此外,我們處於一個負載平衡的環境中,因此斷開連接可能會在其他未裝入字典的服務器上結束。 – Lodewijk

+0

我看過一些以前的代碼,並且Context.User.Identity.Name確實顯示當前登錄的用戶。如果環境負載平衡,你應該看看Redis的SignalR。 https://github.com/SignalR/SignalR/wiki/SignalR-with-Redis-Running-on-a-Windows-Azure-Virtual-Machine – Steve

0

事實上,您需要您的解決方案在負載平衡的環境中工作,這強化了您需要將連接字符串存儲在與會話不同的某些內容中的事實。鍵值存儲(您如何實現它並不重要),其中鍵是ConnectionId(斷開連接時唯一可用的信息),值是連接字符串。如果你願意,你可以在任何其他地方繼續使用會話,但我認爲你應該將整個應用程序從那裏寫入和讀取,至少對於那些信息。

+0

會話狀態在負載平衡環境中沒有問題,至少還沒有十年。 –

+0

在投票前仔細閱讀問題,HttpContext不適用於SignalR(或者至少當時沒有),並且該會話 – Wasp

+1

實際上HttpContext和HttpContext.Current都可用,並且它只是Session的空值。 – Dave

7

你有一個類似的問題,因爲我需要識別我的應用程序的未經過驗證的訪問者,以個性化他們對SignalR中心的請求。

我已經通過訪問「HttpContext.Current.Request.AnonymousId」解決了它。 AnonymousId映射到SQL數據庫中自我實現的會話實體中的臨時記錄 - 實質上模擬數據庫支持的會話。

在這裏,如果你想定製AnonymousId,或初始化數據庫錄入了一些相關文章:http://msdn.microsoft.com/en-us/library/system.web.httprequest.anonymousid.aspx

此外,你應該能夠訪問上下文中OnDisconnected()這樣的:Context.Request .GetHttpContext()

我希望這會有所幫助。

20

這是一個古老的問題,但我留下我的答案,以防萬一它對任何人有幫助。

由於您的中心擴展了Microsoft.AspNet.SignalR。集線器它可以訪問類型HubCallerContext的語境財產

此酒店需要從主叫暴露了很多信息:

  • 的ConnectionId
  • 查詢字符串
  • 請求
  • 餅乾
  • 用戶

在我的解決方案我使用存儲在Context.User.Identity.Name在我的鍵/值存儲(Redis的在我的情況)的一個關鍵的用戶名來跟蹤所有用戶擁有的連接。

您可以覆蓋OnConnnectOnDisconnect保持與用戶相關的連接列表。你也可以存儲你想要的任何東西以及連接ID(你的用戶連接字符串,在你的情況下)。

+3

不幸的是如果用戶有多個會話打開,基於用戶名的緩存將不起作用... – Dave

+1

您想介紹一下嗎? –

+0

我在這裏有類似的問題:http://stackoverflow.com/questions/27729113/null-exception-on-httpcontext-current-request-cookies-when-firing-signalr-method。這個線程挽救了我把我的頭髮拉出來。我已經解決了我的問題,但我並沒有真正理解這個問題。如果任何人能夠過頭,給我一個很好的答案!我討厭沒有完全理解它而繼續前進。 –