以前用Session的時候總是拿來就用也沒想過先定義再使用今天就換一種方式
SystemWebSessionStateHttpSessionState session = SystemWebHttpContextCurrentSession;//創建Session
sessionAdd(adminTest Session);//Session賦值
sessionTimeout = ;//設置會話超時期限單位為分鐘
ResponseWrite(SystemWebHttpContextCurrentSession[admin]ToString());//測試成功
運行立刻可以可以知道結果了否則有時候session的值為null也不知道還老是問為什麼session不能傳遞到下一頁面呢?為什麼老是丟失呢?
然後在下一頁面
protected void Page_Load(object sender EventArgs e)
{
if (Session[admin] == null)
{ ResponseRedirect(loginaspx);
}
}就完成了登陸的session傳遞了和判斷了
當然用完了例如注銷登陸則需要
Session[admin] = ;//Session[admin] = null 可理解 Session[admin]根本不存在但=只不過說明他的值是 =
Session Abandon ();
結合我二次開發的blog這裡有一點建議如果調試不成功登陸可以考慮在登陸頁面中的
if ( Session[admin]== loginok)
{
ResponseRedirect(indexaspx);
}
代碼不要因為有可能session重復設置導致混亂不清而出錯
我們在用C#開發程序的時候經常會遇到Session很不穩定老是數據丟失下面就是Session數據丟失的解決辦法
在WEBCONFIG文件中修改SESSION狀態保存模式如
<sessionState mode=StateServer stateConnectionString=tcpip=: sqlConnectionString=data source=;Trusted_Connection=yes cookieless=true timeout=/>
說明:WebConfig文件中關於Session的設定如下 sessionState mode=inproc所以要更改
啟動系統服務ASPNET狀態服務 系統默認是手動啟動的
如果SESSION中保存的數據類型是自定義的如結構請在自定義數據類型處序列化會話狀態即在類或結構申明前加[Serializable]
完成以上部狀態即可保存但是在訪問頁面是浏覽器顯示的路徑中增加了一段字符如(S(ltojegcztmqtxevmtb))
SessionState 的Timeout)其主要原因有三種
一有些殺病毒軟件會去掃描您的WebConfig文件那時Session肯定掉這是微軟的說法
二:程序內部裡有讓Session掉失的代碼及服務器內存不足產生的
三程序有框架頁面和跨域情況
第一種解決辦法是:使殺病毒軟件屏蔽掃描WebConfig文件(程序運行時自己也不要去編輯它)
第二種是檢查代碼有無SessionAbandon()之類的
第三種是在Window服務中將ASPNET State Service 啟動
又找到一篇文章寫是這樣的
Session的實現
的Session是基於HttpModule技術做的HttpModule可以在請求被處理之前對請求進行狀態控制由於Session本身就是用來做狀態維護的因此用HttpModule做Session是再合適不過了
原因
bin目錄中的文件被改寫有一種機制為了保證dll重新編譯之後系統正常運行它會重新啟動一次網站進程這時就會導致Session丟失所以如果有access數據庫位於bin目錄或者有其他文件被系統改寫就會導致Session丟失
原因
文件夾選項中如果沒有打開在單獨的進程中打開文件夾窗口一旦新建一個窗口系統可能認為是新的Session會話而無法訪問原來的Session所以需要打開該選項否則會導致Session丟失
原因
似乎大部分的Session丟失是客戶端引起的所以要從客戶端下手看看cookie有沒有打開
原因
Session的時間設置是不是有問題會不會因為超時造成丟失
原因
IE中的cookie數量限制(每個域個cookie)可能導致session丟失
原因
使用web garden模式且使用了InProc mode作為保存session的方式
解決丟失的經驗
判斷是不是原因造成的可以在每次刷新頁面的時候跟蹤bin中某個文件的修改時間
做Session讀寫日志每次讀寫Session都要記錄下來並且要記錄SessionIDSession值所在頁面當前函數函數中的第幾次Session操作這樣找丟失的原因會方便很多
如果允許的話建議使用state server或sql server保存session這樣不容易丟失
在globalasa中加入代碼記錄Session的創建時間和結束時間超時造成的Session丟失是可以在SessionEnd中記錄下來的
如果有些代碼中使用客戶端腳本如javascript維護Session狀態就要嘗試調試腳本是不是因為腳本錯誤引起Session丟失
哪些情況下該進程會重啟動呢?微軟的一篇文章告訴了我們
配置文件中processModel標簽的memoryLimit屬性
Globalasax或者nfig文件被更改
Bin文件夾中的Web程序(DLL)被修改
殺毒軟件掃描了一nfig文件
更多的信息請參考PRB: Session variables are lost intermittently in ASPNET applications
解決辦法
前面說到的sessionState標簽中mode屬性可以有三個取值除了InProc之外還可以為StateServerSQLServer這兩種存Session的方法都是進程外的所以當aspnet_wpexe重起的時候不會影響到Session
現在請將mode設定為StateServerStateServer是本機的一個服務可以在系統服務裡看到服務名為ASPNET 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的對象除了基本數據類型(默認的數據類型如intstring等)外都必須序列化只需將[Serializable]標簽放到要序列化的類前就可以了
如
[Serializable]
public class MyClass
{
}
總結的不是很有條理還要慢慢消化最要緊是思考結合自己的實際情況檢查測試
From:http://tw.wingwit.com/Article/program/net/201311/12792.html