C#如何設置session過期時間


1、操作系統
  步驟:開始——〉管理工具——〉Internet信息服務(IIS)管理器——〉網站——〉默認網站——〉
  右鍵“屬性”——〉主目錄——〉配置——〉選項——〉啟用會話狀態——〉會話超時(在這兒設置你要的超時時間,單位分鍾)。確定即可。
2、ASP.NET應用程序中Session過期時間的設置
  在ASP.NET這樣的Web應用中,Session是用來保存用戶狀態的常用手段,不過由於服務器內存空間是有限的,所以Session過期時間設置是很有必要的。
  在ASP.NET中如何設置Session的過期時間呢,很簡單,修改web.config配置。  
  具體修改方法如下,在web.config中進行如下配置
    <system.web>
    <sessionState mode="InProc" timeout="30"/>
    </system.web>  
  在這里指的是Session過期時間為30分鍾。也就是說30分鍾后如果當前用戶沒有操作,那么Session就會自動過期了。  
3、在調用Session的cs頁中,Load事件里面寫以下  Session.Timeout = 30;  
4、Store session in asp.net state service  
   <sessionState cookieless="false" timeout="480" mode="StateServer" 
   stateConnectionString="tcpip=127.0.0.1:42424" 
   sqlConnectionString="data source=127.0.0.1;user id=sa;password=" />看一下,看你的程序是用到了哪種設置方式,把時間改成你需要的時間就可以了。


ASP.Net中的Session
如果用戶關閉了Cookie,Session的值一樣也可以被保存。
config.web文件進行一些配制,因為在其中找到關於Session的設置文本,如:
< sessionstate cookieless="false" />
把cookieless="false" 改成cookieless="true" ,那么以后Session就不儲存在cookies中了,而在儲存在URL中。
Session還能在另外一台主機上保持:把localhost改成您要的主機
<sessionstate inproc="false" server="localhost" port="42424" />


***************************
先說明情況:公司做監控系統,B/S結構,主要用在局域網內部!監控系統開機可能要開好長時間,管理員的ID和權限等是寫在Session里的——
我想不用Cookies的原因可能是Cookies不是很安全,還有就是局域網內,只是幾台機子訪問服務器,Session沒有幾個,所以即使總保持着Session
也不會太占用資源,最起碼服務器能承受的起。   
保持Session的方法:有人說設session.timeout=-1,或小於0的數。這種方法肯定是不行的,session計算時間以分鍾為單位,必須是大於等於1的整數。
又有人說設session.timeout=99999。這種同樣不行,session有最大時間限制。我經過測試發現最大值為24小時,也就是說你最大可以session.timeout=1440,
1441都是不可以有,呵呵。本人測試環境:win2003+IIS6.0+ASP3.0。   
所以想通過設session.timeout的過期時間讓session永不過期是不可能的。寫到Cookies里是比較好的方法,網上也有很多這樣的教程,這里就不再說了!
還有就是用在要保持session的頁里設隱藏iframe每隔一段時間(這個時間小於session.timeout的時間)把涮新一次frame里的空頁面!實現方法如下:   
在要保持session頁里加上:     
< iframe   width=0   height=0   src="SessionKeeper.asp">   
< /iframe>     
同目錄下建一下SessionKeeper.asp的文件。   
< html>   
< head>   
< meta   http-equiv="Refresh"   content="300;url=sessionKeeper.asp">     
< !--每隔300秒刷新一下自己,為了和服務器通訊一下,保持session不會丟-->   
< /head>   
< /html>   
這種方法還是比較長見的,另外還有一種和上面類似的方法,不過他不是用meta自動涮新嵌套的iframe的方法。
他是用javascript:window.setTimeout("functionname()",10000);第隔一段時間時間自動調用一個函數的方法,當然函數里還是要去連接一個空的文件。
具體方法如下:   
  在要保持session面里加上:     
  <script     id=Back     language=javascript></script>   
  <script   language=javascript>   
    function   keepsession(){   
      document.all["Back"].src="SessionKeeper.asp?RandStr="+Math.random();   
      //這里的RandStr=Math.random只是為了讓每次back.src的值不同,防止同一地址刷新無效的情況   
      window.setTimeout("keepsession()",900);     //每隔900秒調用一下本身   
      }   
    keepsession();   
  </script>   
這樣同一目錄下建一個空內容的sessionKeeper.asp就文件就可以了!   
問題沒有解決:通過以上的方法Session保持應該沒有問題了,IIS默認無請求的清除session的值為20分鍾,我設的每次交互服務的時間都遠遠小於這個值,
可是我大概過個一天多的時間,session還是無緣無故的沒了!郁悶。   
后來在網上多方查找終於找到答案:原來IIS為了保護服務器,有一個“回收”的概念!測試了半天終於有了點大體了解(不要笑我菜^-^)。
先來看看這個“回收”在哪設置。   
啟動IIS管理器->應用程序池->右鍵->屬性->回收選項卡,有一項是默認就起作用的,就是第一項:“回收工作進程(分鍾)”默認值1740分鍾,大約29個小時。
他是什么意思呢?我個人理解:在session.timeout之后再過1740分鍾自動把所有仍在保持的session清除。
這個值最大可設為4000000,大概是2700多天!我直接取消了,不用他自動回收!問題終於解決。   
另外這個屬性對話框中還有其它幾項:第二項應該是連接的用戶超過了一定數目回收。第三項是到某一個時間就自動回收。
在“性能”選項卡中“在空閑此時間段后關閉工作進程”,這里就是設置IIS默認session.timeout時間的地方了。默認值20分鍾,
這里同樣最大值可設為4000000,和在ASP頁中設置session.timeout最大值為1440不同。在這里設置超過大於1440的值是否起作用,我沒作測試,
我想應該是可以的。那為什么在ASP頁中session.timeout的值最大只能是1440在IIS的屬性中卻能設的那么大呢?
應該是屬於一種保護機制:ASP頁的session.timeout的值哪個用戶都可以設,IIS里卻只有管理員可以設,兩者的權限不同,所以設置的范圍就不同了。   


************
在asp.net中的Session存儲方式不象asp那樣單一,一共提供了三種存儲方式,由於最近一個2000多人使用的web軟件出現了故障,用戶每天早上在某一時刻出現難以登陸現象,接着Session丟值出現,只有重啟IIS,或機器.這時程序恢復正常了.整天都不會出現同樣的問題 ,但是第二天依舊!這種現象持續了好幾天,我檢查了一下日志文件,高峰每秒訪問人數大概20人左右,同時大概100多人在線,以后訪問人數還會增加,為了解決這個怪問題,先從軟件着手,故而三種方式都應用了一番。


打開web.config文件


< sessionState   
        mode="InProc" 
        stateConnectionString="tcpip=127.0.0.1:42424" 
        sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes" 
        cookieless="false"   
        timeout="20"   
/> 
其中默認的mode是InProc類型,這種模式和以前ASP模式一樣,就是服務器將Session信息存儲在IIS進程當中,當IIS關閉、重起后這些進程信息都會丟失,
但這種模式的性能最高(具體沒測,看書上說),這種模式是asp.net的默認方式。
由於這種模式出現了故障,當時我的考慮就是由於訪問量過大的原因,導致Inetinfo.exe進程崩潰。用戶難以登陸以致Session丟值出現故障,
我采用了另外一種Session的存儲方式把Session信息存儲在進程外。
首先,打開管理工具找到服務,找到名為:asp.net State Service的服務,啟動它.並且改成自動啟動。這時你可以在任務管理器中看到一個
名為aspnet_state.exe的進程。這就是我們保存session信息的進程。
然后,回到web.config文件中把Mode的值改為StateServer,保存文件。OK.
< sessionState   
        mode="StateServer" 
        stateConnectionString="tcpip=127.0.0.1:42424" 
        sqlConnectionString="data source=192.10.78.76;User id=sa;password=sa" 
        cookieless="false"   
        timeout="20"   
/> 
這種模式當我們重起IIS,保存的session值不會丟失。另外這種方式還可以把信息保存在其他機器的進程中,不過還要更改
stateConnectionString="tcpip=127.0.0.1:42424",IP地址改為其他機器即可。
另外還采取了其他的措施.比如把數據庫和Web服務器分開,數據庫服務器不提供WEB服務,Web服務器不提供數據庫服務,
然后把連接池擴大,由於asp.net中ADO.NET數據訪問默認連接池數量為100, 后來我擴大到6000順便把寫法加上來
“Server=(local);Database=rgs;password=sa;user ID=sa;Max Pool Size =6000; Min Pool Size =5;Pooling=True”
最后把Machine.config中的ProcessModel中的memoryLimit改為95,默認為60,表示內存占用超過60%后iis進程會自動重起。接着還做寫其它一些優化IIS的方法,把注冊表的IIS緩存加大等等 。
當我做完這些優化步驟后,整個軟件運行比較良好,第二天沒有發現堵塞的現象,但是第三天情況又出現了,實在沒辦法,我采取了最后一種ASP.NET中的session存儲方法就是將Session存儲在SQLServer中,我想這樣穩定性應該強些。
要使用SQLServer中,首先在會話狀態的SQLServer的計算機上,運行InstallSqlState.sql或InstallPersistSqlState.sql(默認位置:systemroot\Microsoft.NET\Framework\versionNumber下面)兩個腳本都創建一個名為ASPState的數據庫,兩個腳本的差別在於放置ASPStateTempApplication和ASPStageTempSessions表的位置。InstallSqlState.sql腳本將這些表添加到TempDB數據庫,該數據庫在計算機重起時將丟失數據,而InstallPersistSqlState.sql腳本將這些表添加到ASPState數據庫,該數據庫重啟時保留會話數據。
然后在應用程序的web.config文件中,把< sessionState>元素的mode屬性設置為SQLServer,最后將sqlConnectionString屬性設置為Integrated Security=SSPI;data source=serverName;
< sessionState mode="SQLServer" 
sqlConnectionString=" Integrated Security=SSPI;data source=dataserver;" 
cookieless="false" 
timeout="20"/>  
< /sessionState>  
如果部署在其他機器上可以更改為,加上用戶名和密碼
< sessionState   
        mode="SQLServer" 
        stateConnectionString="tcpip=127.0.0.1:42424" 
        sqlConnectionString="data source=192.10.78.76;User id=sa;password=sa" 
        cookieless="false"   
        timeout="20"   
/> 
這樣部署完成了,如果不想使用這種可以刪除掉,只要在相應的目錄(systemroot\Microsoft.NET\Framework\versionNumber)找到
UninstallPersistSqlState.sql或者UninstallSqlState.sql文件運行即可。這樣就介紹了ASP.NET中的session存儲模式。
最后要注意的是,無論使用StateServer或者SQLServer模式時,當使用session轉換對象時,注意對象要先序列化,就是在類前加上
Serializable,否則會出現錯誤!
 
轉載自: http://blog.csdn.net/stwuyiyu/article/details/8866110


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM