ASP.NET Session 遇到問題
2013年5月27日 星期一
今天同事遇到使用Session發生的錯誤,錯誤訊息如下:
無法序列化工作階段狀態。在 'StateServer' 和 'SQLServer' 模式中,ASP.NET 將序列化工作階段狀態物件,因此不允許無法序列化的物件或 MarshalByRef 物件。在 'Custom' 模式中,自訂工作階段狀態存放區執行類似的序列化作業時,也會有同樣的限制
神奇的是在他本機上不會遇到,但在測試機上會出錯。
查詢後原來ASP.NET的Session是除了Server外還可以存在其他地方,如下方說明:
每個選項是由 SessionStateMode列舉型別中的值識別。 下列清單描述可用的工作階段狀態模式:
-
InProc 模式,此模式會將工作階段狀態存放在 Web 伺服器的記憶體中。 這是預設值。
-
StateServer 模式,此模式會將工作階段狀態儲存在稱為 ASP.NET 狀態服務的個別處理序中。 這樣可以確保工作階段狀態在 Web 應用程式重新啟動時保留下來,並且讓 Web 伺服陣列中的多個 Web 伺服器都能夠使用工作階段狀態。
-
SQLServer 模式,此模式會將工作階段狀態儲存在 SQL Server 資料庫中。 這樣可以確保工作階段狀態在 Web 應用程式重新啟動時保留下來,並且讓 Web 伺服陣列中的多個 Web 伺服器都能夠使用工作階段狀態。
-
Custom 模式,此模式可讓您指定自訂儲存提供者 (Provider)。
-
Off 模式,此模式會停用工作階段狀態。
參考來源:http://msdn.microsoft.com/zh-tw/library/ms178586(v=vs.100).aspx
會發生錯誤的那台Session模式為:StateServer,但卻沒有序列化(Serializable)
解決方法:自訂類別加一個Serializable屬性標記[Serializable]。
[Serialzable]
public class getData
{
//取得資料
}
延伸閱讀:
1.在 ASP.NET 網站使用 Session 時,常常因為 web.config 修改或更新 Bin\ 目錄下的 dll 而導致 Session 消失,Session 常常消失"也挺惱人的,不是導致突然被自動登出,就是發生非預期的 Exception ... 等。
可以參考保哥這篇"如何讓 ASP.NET 使用 Session 資料時不要再自動消失"
2."觀察ASP.NET State Server的資料傳輸時機"
Read more...