注
用這個方法前需要啟動ASP
NET State Service:開始
>運行
>輸入 services
msc 回車 找到ASP
NET State Service
雙擊
改成自動
並啟用
正常操作情況下Session會無故丟失
因為程序是在不停的被操作
排除Session超時的可能
另外
Session超時時間被設定成
分鐘
不會這麼快就超時的
這次到CSDN上搜了一下帖子
發現好多人在討論這個問題
然後我又google了一下
發現微軟網站上也有類似的內容
現在我就把原因和解決辦法寫出來
原因
由於程序是默認配置
所以Web
Config文件中關於Session的設定如下
<sessionState mode=
InProc
stateConnectionString=
tcpip=
:
sqlConnectionString=
data source=
;Trusted_Connection=yes
cookieless=
true
timeout=
/>
我們會發現sessionState標簽中有個屬性mode
它可以有
種取值
InProc
StateServer
SQLServer(大小寫敏感)
默認情況下是InProc
也就是將Session保存在進程內(IIS
是aspnet_wp
exe
而IIS
是W
wp
exe)
這個進程不穩定
在某些事件發生時
進程會重起
所以造成了存儲在該進程內的Session丟失
哪些情況下該進程會重起呢?微軟的一篇文章告訴了我們
配置文件中processModel標簽的memoryLimit屬性
Global
asax或者nfig文件被更改
Bin文件夾中的Web程序(DLL)被修改
殺毒軟件掃描了一些
config文件
更多的信息請參考PRB: Session variables are lost intermittently in ASP
NET applications
解決辦法
前面說到的sessionState標簽中mode屬性可以有三個取值
除了InProc之外
還可以為StateServer
SQLServer
這兩種存Session的方法都是進程外的
所以當aspnet_wp
exe重起的時候
不會影響到Session
現在請將mode設定為StateServer
StateServer是本機的一個服務
可以在系統服務裡看到服務名為ASP
NET State Service的服務
默認情況是不啟動的
當我們設定mode為StateServer之後
請手工將該服務啟動
這樣
我們就能利用本機的StateService來存儲Session了
除非電腦重啟或者StateService崩掉
否則Session是不會丟的(因Session超時被丟棄是正常的)
除此之外
我們還可以將Session通過其他電腦的StateService來保存
具體的修改是這樣的
同樣還在sessionState標簽中
有個stateConnectionString=
tcpip=
:
屬性
其中有個ip地址
默認為本機(
)
你可以將其改成你所知的運行了StateService服務的電腦IP
這樣就可以實現位於不同電腦上的程序互通Session了
如果你有更高的要求
需要在服務期重啟時Session也不丟失
可以考慮將mode設定成SQLServer
同樣需要修改sqlConnectionString屬性
關於使用SQLServer保存Session的操作
請訪問這裡
在使用StateServer或者SQLServer存儲Session時
所有需要保存到Session的對象除了基本數據類型(默認的數據類型
如int
string等)外
都必須序列化
只需將[Serializable]標簽放到要序列化的類前就可以了
如
[Serializable]
public class MyClass
{
……
}
具體的序列化相關的知識請參這裡
至此
問題解決
From:http://tw.wingwit.com/Article/program/net/201311/11407.html