2009-12-08 64 views
2

我很抱歉如果之前已經問過這個問題,但是我還沒有完全發現我頭腦中的具體問題。在ASP.NET中使用會話變量的替代方法(包括MVC)

對於我建立的網站(使用ASP.NET MVC) - 性能是一個重要特性。此外,該站點有可能託管在應用程序池每20分鐘回收一次的環境中(或者如果達到內存閾值,則更快)。我想完全獨立於依賴會話變量,而是將類似GUID的值存儲在cookie中。我的推理是 - 我不知道會話會持續多長時間,因爲AppPool回收,並且不希望他們的會話過早超時並導致他們不得不重複登錄。

Cookie中的GUID值將用作存儲會話狀信息(用戶ID值等)的表的查找鍵。所以如果我需要這些數據,我可以從數據庫中檢索它。我仍然會利用Session_OnEnd事件來清除會話表中的「最後一次活動」值超過20分鐘(或者無論長時間的會話是否配置爲最後一次)。所以我想我仍然會使用會話狀態,而不是會話變量。

我的擔心雖然也是關於表現。因此,我很好奇是否有更好的方法避免使用會話變量,同時仍然保持瞭解用戶身份的能力,並以「會話式」的方式管理他們對網站的訪問。我仍然是MVC的新手,但多年來在ASP.NET中有豐富的經驗,所以我希望我的問題很有意義!

編輯:我有點回避想要使用SQL會話狀態,因爲我可能會在共享的SQL服務器託管環境中,並不認爲我將有一個能夠創建/運行作業的登錄如果有必要刪除過期的SQL會話數據等。在AppPool回收場景中,根據Session_OnEnd和Cookie使用是否存在真正的缺點?當AppPool回收時,Session_OnEnd會不會執行當前會話?

回答

5

我們假定你是會議只存儲在工作過程中,你可以有SQL狀態的會話,check this link before going any further

+1

否則稱爲SQL和Cookies。 – madcolor 2009-12-08 18:55:32

+0

+1:如果你使用SQL狀態持久性,你不必滾動自己的數據庫 – 2009-12-08 18:55:58

+0

http://www.dbazine.com/sql/sql-articles/cook9 – madcolor 2009-12-08 19:06:42

1

使用數據庫來提供跨網絡農場「耐用」的持久性/花園是一個常用的技術。還有distributed caching systems可用於使會話狀態數據跨服務器可用並重新啓動。

例如,我見過的分佈式系統之一使用UDP在多個服務器之間共享會話數據。我預計分佈式緩存會帶來一些性能優勢,因爲數據存儲在服務器的內存中,因此不會查找數據庫。

1

如果您不能使用進程內狀態,則必須恢復到外部存儲庫(可能是數據庫)。

那麼爲什麼不把會話狀態存儲在數據庫中?有內置的支持,它有效地解決了回收問題,同時保持可接受的性能,如果會話狀態保持較小。

+0

「會話狀態保持較小」 - 您對此有何定義?會話變量的數量少於2? 10? – jamauss 2009-12-08 19:08:53

+0

不是絕對數量,而是它們的類型。當它們不在進程中時,它們需要可序列化,所以您應該注意序列化對象圖很小。 – Lucero 2009-12-08 19:40:40

+0

我只會使用簡單的類型 - String,DateTime,Int等,它們都是可序列化的類型,對吧? – jamauss 2009-12-08 19:46:58

0

查看定製緩存機制。就像你說的,你不能使用會話變量,因爲它聽起來像你的網站將負載平衡?會話可能因應用池回收而改變。你也不希望看到狀態的頭頂上(你可以使用它,但它會影響性能)。

有緩存和其它提及的機型之間有三個主要區別:

  1. 緩存是線程安全的
  2. 項目在緩存中自動刪除在緩存的支持依賴
  3. 項目