close

 Session莫名失的解決辦法


Asp.net 預設配置下,Session莫名遺失的原因及解決辦法


原因:



由於Asp.net程式是預設配置,所以Web.Config檔中關於Session的設定如下:
mode="InProc" stateConnectionString="tcpip=127.0.0.1:42424" sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes" cookieless="true" timeout="60"/>

我們會發現sessionState標籤中有個屬性mode,它可以有3種取值:InProcStateServer?SQLServer(大小寫敏感) 。預設情況下是InProc,也就是將Session保存在進程內(IIS5aspnet_wp.exe,而IIS6W3wp.exe),這個Process不穩定,在某些事件發生時,Process會重起,所以造成了存儲在該Process內的Session遺失。

哪些情況下該Process會重起呢?微軟的一篇文章告訴了我們:
1
、配置檔中processModel標籤的memoryLimit屬性
2
Global.asax或者Web.config文件被更改
3
Bin檔夾中的Web程式(DLL)被修改
4
、殺毒軟體掃描了一些.config文件。
更多的資訊請參考PRB: Session variables are lost intermittently in ASP.NET applications

解決辦法:



前面說到的sessionState標籤中mode屬性可以有三個取值,除了InProc之外,還可以為StateServerSQLServer。這兩種存Session的方法都是Process外的,所以當aspnet_wp.exe重起的時候,不會影響到Session

現在請將mode設定為StateServerStateServer是本機的一個服務,可以在系統服務裏看到服務名為ASP.NET State Service的服務,預設情況是不啟動的。當我們設定modeStateServer之後,請手工將該服務啟動。

這樣,我們就能利用本機的StateService來存儲Session了,除非電腦重啟或者StateService掛掉,否則Session是不會丟的(因Session超時被丟棄是正常的)。

除此之外,我們還可以將Session通過其他電腦的StateService來保存。具體的修改是這樣的。同樣還在sessionState標籤中,有個stateConnectionString="tcpip=127.0.0.1:42424"屬性,其中有個ip位址,預設為本機(127.0.0.1),你可以將其改成你所知的運行了StateService服務的電腦IP,這樣就可以實現位於不同電腦上的Asp.net程式互通Session了。

如果你有更高的要求,需要在服務期重啟時Session也不遺失,可以考慮將mode設定成SQLServer,同樣需要修改sqlConnectionString屬性。關於使用SQLServer保存Session的操作,請訪問這裏

在使用StateServer或者SQLServer存儲Session時,所有需要保存到Session的物件除了基本資料類型(預設的資料類型,如intstring等)外,都必須序列化。只需將[Serializable]標籤放到要序列化的類前就可以了。
如:
[Serializable]
public class MyClass
{
    ......
}
具體的序列化相關的知識請參這裏

至此,問題解決。

參考文章:
ASP.NET Session State FAQ
ASP.NET Session State
[ASP.NET] Session 詳解
PRB: Session Data Is Lost When You Use ASP.NET InProc Session State Mode
PRB: Session Data Is Lost When You Use ASP.NET InProc Session State Mode
ASP.NET HTTP 運行
.NET 中的物件序列化
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 nelman 的頭像
    nelman

    nelman

    nelman 發表在 痞客邦 留言(0) 人氣()