在以前的項目中經常遇到Session容易丢失的問題,郁悶,經過網上搜尋,還是有解決方法的。
預設配置情況下,Web.Config檔案中關于Session的設定如下:
<sessionState 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種取值:InProc、StateServer,SQLServer(注意大小寫) 。
預設情況下是InProc,也就是将Session儲存在程序内(IIS5是aspnet_wp.exe,而IIS6是W3wp.exe),這個程序不穩定,
在某些事件發生時(比如防毒軟體等),程序會重起,是以造成了存儲在該程序内的Session丢失。
解決辦法:不用要InProc模式,而采用StateServer模式,同時将服務中的"ASP.NET 狀态服務"設定為自動啟用,這樣的話,
session就不依賴于某一程序了。
<sessionState mode="StateServer" cookieless="false" timeout="20000" />
Session丢失已經是一種習以為常的問題了,在自己知道如何解決這一問題後,我也不吝啬共享出給大家知道。
解決session丢失的問題有兩種方法:
1)将session儲存在一台sate server中。
2)将session儲存在sql server中。這種方法使用的比較少,是以選擇了第一種方法。
首先根據網上查的資料對webconfig檔案中session部分進行修改。如下:
<sessionState mode="StateServer" cookieless="false" timeout="240" stateCtateNetworkTimeout="14400" />
再在10.164.222.122 這台電腦上的asp.net state server 服務啟動
基本上就行了。體驗一下。
了一個測試程式,在3個小時以後session仍然可用,更絕的是我的電腦都重起了,在其它電腦上打開的網頁中session仍然可用。一番體驗以後,感覺還真不錯。
.NET Framework 正常參考
<sessionState> 元素
為目前應用程式配置會話狀态設定。
<configuration>
<system.web>
<sessionState>
<sessionState mode="Off|InProc|StateServer|SQLServer"
cookieless="true|false"
timeout="number of minutes"
stateC
sqlC
stateNetworkTimeout="number of seconds"/>
必選屬性
屬性 選項 說明
mode 指定在哪裡存儲會話狀态。
Off 訓示會話狀态未啟用。
InProc 訓示在本地存儲會話狀态。
StateServer 訓示在遠端計算機上存儲會話狀态。
SQLServer 訓示在 SQL Server 上存儲會話狀态。
可選屬性
cookieless 指定不具有 Cookie 的會話是否應用于辨別用戶端會話。
true 訓示應使用不具有 Cookie 的會話。
false 訓示不應使用沒有 Cookie 的會話。預設值為 false。
timeout 指定在放棄一個會話前該會話可以處于空閑狀态的分鐘數。預設值為 20。
stateConnectionString 指定遠端存儲會話狀态的伺服器名稱和端口。例如“tcpip=127.0.0.1:42424”。當 mode 為 StateServer 時該屬性是必需的。
sqlConnectionString 為 SQL Server 指定連接配接字元串。飛飛Asp技術.樂園例如“data source=localhost;Integrated Security=SSPI;Initial Catalog=northwind”。當 mode 為 SQLServer 時該屬性是必需的。
stateNetworkTimeout 在使用 StateServer 模式存儲會話狀态時,指定在放棄會話之前 Web 伺服器和狀态伺服器之間的 TCP/IP 網絡連接配接空閑的時間(以秒為機關)。預設值為 10。
備注
使用 StateServer 模式
確定運作 ASP.NET 狀态服務的伺服器是要存儲會話狀态資訊的遠端伺服器。該服務與 ASP.NET 一起安裝,其預設位置為 <驅動器>:\systemroot\Microsoft.NET\Framework\version\aspnet_state.exe。
在應用程式的 Web.config 檔案中,設定 mode=StateServer 并設定 stateConnectionString 屬性。例如,stateC。
使用 SQLServer 模式
在運作 SQL Server 的計算機(它将存儲會話狀态)上運作 InstallSqlState.sql(預設的安裝位置為 <驅動器>:\systemroot\Microsoft.NET\Framework\version)。這将建立一個名為 ASPState 的資料庫,該資料庫具有新的存儲過程并且在 TempDB 資料庫中具有 ASPStateTempApplications 表和 ASPStateTempSessions 表。
在應用程式的 Web.config 檔案中,設定 mode=SQLServer 并設定 sqlConnectionString 屬性。例如,sqlC。飛飛!Asp技術樂園
示例
以下示例指定若幹會話狀态配置設定。
<sessionState mode="InProc"
cookieless="true"
timeout="20"/>
</sessionState>
</system.web>
</configuration>
要求
包含于:<system.web>
Web 平台:IIS 5.0、IIS 5.1、IIS 6.0
配置檔案:Machine.config、Web.config
配置節處理程式:System.Web.SessionState.SessionStateSectionHandler
請參見
ASP.NET 配置 | ASP.NET 設定架構 | SessionStateModule
在Windows2003的伺服器中的IIS6加入了應用程式池來回收一些無用的程序的功能,當由于網站程式的錯誤或通路量太多的導緻的應用程式池會自動回收該程序,防止網站進入“當機”狀态,而這時候的應用程式池的回收就會導緻session變量被清除,就出現了session變量不見的現象。
為了解決這種在Windows2003下才出現的問題,我們在服務端起動ASP.NET State Service服務,并且在系統的machine.config做了一些改動。現在預設的情況下會話狀态mode是StateServer。如果您的網站根目錄下也配有一個web.config配置檔案,請把mode="InProc"改成mode="StateServer",如下代碼,就可以防止session變量的丢失:
<sessionState
mode="StateServer"
cookieless="false"
timeout="30"
/>
+ 注:隻适用于支援asp.net的使用者。