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的資料傳輸時機"



3.web.config SessionState配置詳解

0 意見: