2010-02-02 35 views
3

會話中永遠不應該保存什麼類型的數據?什麼樣的數據永遠不會進入會話?

+1

請詳細說明您的環境,包括語言和如何存儲會話數據。 – 2010-02-02 01:05:16

+0

它是ASP.NET技術,我在使用tepm用戶的操作中遇到了問題,我保持會話並且有點複雜的文檔上傳功能,在會話中保留整個文檔直到它們存儲在數據庫中,因爲這是我們的團隊項目有建築討論.. – eomeroff 2010-02-02 01:13:24

+0

爲什麼有人不喜歡這個問題? – eomeroff 2010-02-02 01:20:24

回答

2

這個答案是PHP會議。

如果你的意思是$_SESSION,那麼它存儲在硬盤驅動器,所以它不會立即在任何類似的餅乾。

但是,在共享主機上,訪問來自其他網站的會話文件有時很容易。

我不會在會話中存儲任何不希望共享主機上的其他人看到的任何內容。

0

只要您將SessionMode="InProc"保留在web.config中,就可以在Session中存儲任何內容。這將任何會話數據存儲在Web服務器內存中的用戶特定上下文中。

但是,如果您想要放大一天並在服務器場中運行您的Web應用程序,則必須使用另一個SessionMode。然後,您不能再存儲不可序列化的複雜類型的對象(不幸的是,字典是常見的候選對象),您將不得不更改設計。

+0

在這種情況下,多GB的數據*可能會造成問題。特別是如果在32位網絡服務器上(理論上可行)。 – BobMcGee 2010-02-02 02:18:45

+0

第二段是爲什麼我總是使用''sessionState mode =「StateServer」... />' - 當我嘗試並存儲一個不可序列化的對象時,我會馬上得到一個錯誤。 – devstuff 2010-02-02 03:16:24

0
  • 數據集:串行化的數據集在會話存儲可能需要最多數量級比該數據集本身更存儲器的順序(即一個1MB數據集可以需要20MB到序列化/ deserialise,它也即在每次請求)。
  • 控件:在會話中存儲控件(及其集合)意味着ASP.NET無法在頁面請求的最後清理它們,導致內存泄漏。

請參閱Tess Ferrandez's blog瞭解您應該永遠不應放入會話的其他示例,以及原因。

1

這可能是一個很主觀的問題。技術上講,任何可序列化的東西都可以存儲在會話中。但是肯定有不希望在會話中添加內容的場景。複雜對象,具有大集合作爲屬性的對象等。所有這些東西都被序列化爲字節數組並保存在內存中(對於InProc會話狀態),然後再次在代碼中需要時反序列化。對象越複雜,它可以來回傳遞的資源越多。

根據您擁有的用戶數量,您可能希望限制進入會話的項目數,也許使用ViewState或其他持久性方法。如果它確實是用於多個頁面的東西,那麼它可能是會話的一個好候選。如果它只用於一兩頁,那麼ViewState,QueryString等可能會更好。

0

股票的提示,盜版光盤,完整長度的電影(除「科員」,那部電影是真棒),模擬信息,...

這個問題似乎有點模糊 - 我能想到的無數種不應存儲在會話中的信息!

4

如果可能,在會話中存儲沒有任何。這是維護國家的不可靠方法,特別是如果您需要遷移到網絡農場。另外,我認爲它鼓勵糟糕的設計。 HTTP是無狀態的,並且網站的設計方式應該是假定對於任何請求,您都可以從頭開始。

+0

用戶會話適用於Web場,但不適用於應用程序會話。 – 2010-02-02 03:03:19

+0

我同意雅各布。如果你的請求是無狀態的,它使得該網站更容易測試。 – 0sumgain 2010-02-02 03:18:26

+2

@Chris,即使是用戶會話,也不能100%依賴他們。在任何時候,場中的一個節點都可以被刪除,從而清除存儲在那裏的所有內存中會話。當然,您可以將會話存儲在數據庫中,但您也可以在該點使用具有已定義模式的實際表格。 – Jacob 2010-02-02 03:25:58

相關問題