2013-11-15 72 views
3

我有一個Web應用程序連接到多個數據庫的實例。基於域名(例如www.shop1.com,www.shop2.com,..),我在實體框架中切換連接字符串。切換Sql會話狀態數據庫

shop1.com -> Database1 

shop2.com -> Database2 

shop3.com -> Database3 

到目前爲止好。

我也使用Sql Server會話狀態,我想切換會話狀態數據庫,就像我爲我的數據切換數據庫。

shop1.com -> SessionStateDatabase1 

shop2.com -> SessionStateDatabase2 

shop3.com -> SessionStateDatabase3 

在此先感謝您的幫助。如果你想知道爲什麼我這樣做


的更多信息:

其實我實現多租戶。上面的描述顯示了三個站點。事實上,我擁有50多個網站。未來幾個月網站的數量將會增長。目前,所有站點都單獨部署,這意味着無論何時必須推出補丁或更新,我都部署全部50個站點。以這種方式維護網站正成爲一場噩夢。所以我在考慮在一個實例上放置5到10個站點,具體取決於它們的用途,這樣我就可以維護更少的實例。

回答

1

在類似情況下,這個,我總是看看框架的源代碼。首先我找出配置存儲會話狀態連接字符串的位置,然後找到它正在使用的位置。私有類System.Web.SessionState.SqlSessionState.SqlSessionStateStore有一個方法OneTimeInit(),它讀取連接字符串。在這裏我注意到有partiniong的支持,請看這裏:http://msdn.microsoft.com/en-us/library/aa478952.aspx。我從來沒有聽說過這個,但它看起來確實如你所願,你可以根據你想要的任何標準將會話狀態存儲在多個數據庫中。順便說一句,這是一個很酷的功能。另外,如果它不能解決問題,你可以嘗試實現自己的SessionStateStoreProviderBase實現,該實現是公共可覆蓋的。

+0

謝謝@fejesjoco。我肯定會在下週看到它,因爲它看起來很有前途。 – Oxon

+1

我懷疑還有其他好的方法可以做到這一點,而且這是一個支持和不錯的方式。實施IPartitionResolver不是最簡單的任務,因爲您需要將會話ID映射到連接字符串。所以如果你想根據域名來決定,那麼你需要以某種方式將域名映射到會話ID。您可以將該映射存儲在某處(在Global Session_Start事件中),或者...我能想到的最簡單的技巧是使用自定義ISessionIDManager並將數據庫標識符直接放入會話ID中。所以當你看到會話ID時,你知道它在哪個數據庫中。 – fejesjoco

0

由於會話狀態連接不是由您的代碼管理的,因此您無法切換它。它是一個應用程序級配置和超越代碼控制。但是不應該出現這種需要。一臺服務器將能夠管理您擁有的所有三個域的會話狀態。當用戶從shop1.com移動到shop2.com並仍然保留舊會話時,唯一的擔心就是可能。

+0

用戶可以從shop1.com移動到shop2.com的原因引起了關注。此外,如果用戶只在shop1上登錄時設法在shop2上做某件事,我也非常關心數據的安全性。 – Oxon

+0

我相信必須有一種解決方法或處理這種情況的不同方式。 – Oxon

+1

如果會話ID存儲在cookie中,瀏覽器將不會將其發送給不同的域。所以這裏沒有問題。 – user2970362

0

是否有一些原因,你不會考慮作爲三個獨立的Web應用程序運行(我假設,相同的代碼)?

  • 一個錯誤不會採取了所有三個站點
  • 會話狀態是在應用分離
  • 允許擴展能力點可以分配到不同的系統,增長決定
+0

好問題。其實我正在實施多租戶。其實我沒有三個網站。我有超過50個。網站的數量在未來幾個月會增長。目前,所有站點都單獨部署,這意味着無論何時必須推出補丁或更新,我都部署全部50個站點。以這種方式維護網站正成爲一場噩夢。所以我在考慮在一個實例上放置5到10個站點,具體取決於它們的用途,這樣我就可以維護更少的實例。 – Oxon

+0

多租戶模式與數據庫有關,與網站託管容器的關係較少,如果您認爲問題在50的情況下很難實現,那麼您可能更願意查看網絡農場移動到多個站點的一個數據庫。 –