ASP.NET2.0系統(tǒng)時(shí),在程序中做刪除或創(chuàng)建文件操作時(shí),出現(xiàn)session丟失問題。
采用了如下方法:
1、asp.net Session的實(shí)現(xiàn):
asp.net的Session是基于HttpModule技術(shù)做的,HttpModule可以在請(qǐng)求被處理之前,對(duì)請(qǐng)求進(jìn)行狀態(tài)控制,由于Session本身就是用來做狀態(tài)維護(hù)的,因此用HttpModule做Session是再合適不過了。
ASP.NET中Session的狀態(tài)保持方式
ASP.NET提供了Session對(duì)象,從而允許程序員識(shí)別、存儲(chǔ)和處理同一個(gè)瀏覽器對(duì)象對(duì)服務(wù)器上某個(gè)特定網(wǎng)絡(luò)應(yīng)用程序的若干次請(qǐng)求的上下文信息。Session對(duì)應(yīng)瀏覽器與服務(wù)器的同一次對(duì)話,在瀏覽器第一請(qǐng)求網(wǎng)絡(luò)應(yīng)用程序的某個(gè)頁面時(shí),服務(wù)器會(huì)觸發(fā)Session_onStart事件;在對(duì)話超時(shí)或者被關(guān)閉的時(shí)候會(huì)觸發(fā)Session_onEnd 事件。程序員可以在代碼中響應(yīng)這兩個(gè)事件來處理與同一次對(duì)話相關(guān)的任務(wù),如開辟和釋放該次對(duì)話要使用的資源等。
在ASP.NET的程序中要使用Session對(duì)象時(shí),必須確保頁面的@page指令中EnableSessionState屬性是True或者Readonly,并且在web.config文件中正確的設(shè)置了SessionState屬性。
ASP.NET中Session的狀態(tài)保持是由web.config文件中的<system.web>標(biāo)記下的<sessionstate>標(biāo)記的mode屬性來決定的。該屬性有四種可能的值:Off、Inproc、StateServer和SQlServer.
設(shè)為Off會(huì)禁用Session.
Inproc是缺省的設(shè)置,這種模式和以前的ASP的會(huì)話狀態(tài)的方法是類似的,會(huì)話的狀態(tài)會(huì)被保存在ASP.NET進(jìn)程中,它的優(yōu)點(diǎn)是顯而易見的:性能。進(jìn)程內(nèi)的數(shù)據(jù)訪問自然會(huì)比夸進(jìn)程的訪問快。然而,這種方法Session的狀態(tài)依賴于ASP.NET進(jìn)程,當(dāng)IIS進(jìn)程崩潰或者正常重起啟時(shí),保存在進(jìn)程中的狀態(tài)將丟失。
為了克服Inproc模式的缺點(diǎn),ASP.NET提供了兩種進(jìn)程外保持會(huì)話狀態(tài)的方法。
ASP.NET首先提供了提供了一個(gè)Windows服務(wù):ASPState,這個(gè)服務(wù)啟動(dòng)后,ASP.NET應(yīng)用程序可以將mode屬性設(shè)置為“SateServer”,來使用這個(gè)Windows服務(wù)提供的狀態(tài)管理方法。
除了在web.config文件中設(shè)置mode屬性為StateServer外,還必須設(shè)置運(yùn)行StateServer服務(wù)器的IP地址和端口號(hào).如果在IIS所在的機(jī)器運(yùn)行StateServer則IP地址就是127.0.0.1,端口號(hào)通常是42424.配置如下:
mode=”StateServer”
stateConnectionString="tcpip=127.0.0.1:42424"
使用這種模式,會(huì)話狀態(tài)的存儲(chǔ)將不依賴IIS進(jìn)程的失敗或者重啟,會(huì)話的狀態(tài)將存儲(chǔ)在StateServer進(jìn)程的內(nèi)存空間中。
另一種會(huì)話狀態(tài)模式是SQLServer模式。這種模式是將會(huì)話的狀態(tài)保存在SQL Server數(shù)據(jù)庫中的。使用這種模式前,必須至少有一臺(tái)SQL Server服務(wù)器,并在服務(wù)器中建立需要的表和存儲(chǔ)過程。.NET SDK提供了兩個(gè)腳本來簡(jiǎn)化這個(gè)工作:InstallSqlState.sql和UnInstallSqlState.sql。這兩國文件存放在下面路徑中:
<%SYSTEMDRIVER%>\Winnt\Microsoft.NET\Framework\<%version%>\
要配置SQL Server 服務(wù)器,可以在命令行中運(yùn)行SQL Server提供的命令行工具osql.exe
osql -s [server name] -u [user] -p [password] <InstallSqlState.sql
例如:
osql -s (local) -u as -p “”-i InstallSqlState.sql
做好必要的數(shù)據(jù)庫準(zhǔn)備工作后,將web.config文件中的sessionstate元素的mode屬性改為”sqlserver”,并指定SQL連接字符串。具體如下:
mode="SQLServer"
sqlConnectionString="data source=127.0.0.1;userid=sa;password=;Trusted_Connection=yes"
使用SQLServer模式處了可以使Session的狀態(tài)不依賴于IIS服務(wù)器之外,還可以利用SQL Server的集群,使?fàn)顟B(tài)存儲(chǔ)不依賴于單個(gè)的SQL Server,這樣就可以為應(yīng)用程序提供極大的可靠性。
2、丟失原因:
轉(zhuǎn)(1):Asp.net 默認(rèn)配置下,Session莫名丟失的原因及解決辦法
正常操作情況下Session會(huì)無故丟失。因?yàn)槌绦蚴窃诓煌5谋徊僮?,排除Session超時(shí)的可能。另外,Session超時(shí)時(shí)間被設(shè)定成60分鐘,不會(huì)這么快就超時(shí)的。
原因和解決辦法寫出來。
原因:
由于Asp.net程序是默認(rèn)配置,所以Web.Config文件中關(guān)于Session的設(shè)定如下:
<sessionState
mode='InProc'
stateConnectionString='tcpip=127.0.0.1:42424'
sqlConnectionString='data source=127.0.0.1;Trusted_Connection=yes'
cookieless='true'
timeout='60'/>
我們會(huì)發(fā)現(xiàn)sessionState標(biāo)簽中有個(gè)屬性mode,它可以有3種取值:InProc、StateServer?SQLServer(大小寫敏感)。默認(rèn)情況下是InProc,也就是將Session保存在進(jìn)程內(nèi)(IIS5是aspnet_wp.exe,而IIS6是W3wp.exe),這個(gè)進(jìn)程不穩(wěn)定,在某些事件發(fā)生時(shí),進(jìn)程會(huì)重起,所以造成了存儲(chǔ)在該進(jìn)程內(nèi)的Session丟失。
[asp的Session是具有進(jìn)程依賴性的。ASP Session狀態(tài)存于IIS的進(jìn)程中,也就是inetinfo.exe這個(gè)程序。所以當(dāng)inetinfo.exe進(jìn)程崩潰時(shí),這些信息也就丟失。]
哪些情況下該進(jìn)程會(huì)重起呢?微軟的一篇文章告訴了我們:
1、配置文件中processModel標(biāo)簽的memoryLimit屬性
2、Global.asax或者Web.config文件被更改
3、Bin文件夾中的Web程序(DLL)被修改
4、殺毒軟件掃描了一些.config文件。
更多的信息請(qǐng)參考PRB: Session variables are lost intermittently in ASP.NET applications
解決辦法:
前面說到的sessionState標(biāo)簽中mode屬性可以有三個(gè)取值,除了InProc之外,還可以為StateServer、SQLServer。這兩種存Session的方法都是進(jìn)程外的,所以當(dāng)aspnet_wp.exe重起的時(shí)候,不會(huì)影響到Session。
現(xiàn)在請(qǐng)將mode設(shè)定為StateServer。StateServer是本機(jī)的一個(gè)服務(wù),可以在系統(tǒng)服務(wù)里看到服務(wù)名為ASP.NET State Service的服務(wù),默認(rèn)情況是不啟動(dòng)的。當(dāng)我們?cè)O(shè)定mode為StateServer之后,請(qǐng)手工將該服務(wù)啟動(dòng)。這樣,我們就能利用本機(jī)的StateService來存儲(chǔ)Session了,除非電腦重啟或者StateService崩掉,否則Session是不會(huì)丟的(因Session超時(shí)被丟棄是正常的)。
除此之外,我們還可以將Session通過其他電腦的StateService來保存[如使用狀態(tài)服務(wù)器]。具體的修改是這樣的。同樣還在sessionState標(biāo)簽中,有個(gè)stateConnectionString='tcpip=127.0.0.1:42424'屬性,其中有個(gè)ip地址,默認(rèn)為本機(jī)(127.0.0.1),你可以將其改成你所知的運(yùn)行了StateService服務(wù)的電腦IP,這樣就可以實(shí)現(xiàn)位于不同電腦上的Asp.net程序互通Session了。
如果你有更高的要求,需要在服務(wù)期重啟時(shí)Session也不丟失,可以考慮將mode設(shè)定成SQLServer,同樣需要修改sqlConnectionString屬性。關(guān)于使用SQLServer保存Session的操作,請(qǐng)?jiān)L問這里。
在使用StateServer或者SQLServer存儲(chǔ)Session時(shí),所有需要保存到Session的對(duì)象除了基本數(shù)據(jù)類型(默認(rèn)的數(shù)據(jù)類型,如int、string等)外,都必須序列化。只需將[Serializable]標(biāo)簽放到要序列化的類前就可以了。
如:
[Serializable]
public class MyClass
{
......
}
具體的序列化相關(guān)的知識(shí)請(qǐng)參這里。
至此,問題解決。
參考文章:
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 運(yùn)行時(shí)
.NET 中的對(duì)象序列化
備注
(1)使用 StateServer 模式
確保運(yùn)行 ASP.NET 狀態(tài)服務(wù)的服務(wù)器是要存儲(chǔ)會(huì)話狀態(tài)信息的遠(yuǎn)程服務(wù)器。該服務(wù)與 ASP.NET 一起安裝,其默認(rèn)位置為
<驅(qū)動(dòng)器>:\systemroot\Microsoft.NET\Framework\version\aspnet_state.exe。
在應(yīng)用程序的 Web.config 文件中,
設(shè)置 mode=StateServer 并設(shè)置 stateConnectionString 屬性。
例如,stateConnectionString="tcpip=sarath:42424"。
(2)使用 SQLServer 模式
在運(yùn)行 SQL Server 的計(jì)算機(jī)(它將存儲(chǔ)會(huì)話狀態(tài))上運(yùn)行 InstallSqlState.sql
(默認(rèn)的安裝位置為 <驅(qū)動(dòng)器>:\systemroot\Microsoft.NET\Framework\version)。
這將創(chuàng)建一個(gè)名為 ASPState 的數(shù)據(jù)庫,該數(shù)據(jù)庫具有新的存儲(chǔ)過程并且在 TempDB 數(shù)據(jù)庫中具有 ASPStateTempApplications 表和 ASPStateTempSessions 表。
在應(yīng)用程序的 Web.config 文件中,設(shè)置 mode=SQLServer 并設(shè)置 sqlConnectionString 屬性。例如,sqlConnectionString="data source=localhost;Integrated Security=SSPI;Initial Catalog=northwind"。
(3)示例
以下示例指定若干會(huì)話狀態(tài)配置設(shè)置。
<configuration>
<system.web>
<sessionState mode="InProc"
cookieless="true"
timeout="20"/>
</sessionState>
</system.web>
</configuration>
要求
包含于:<system.web>
Web 平臺(tái):IIS 5.0、IIS 5.1、IIS 6.0
配置文件:Machine.config、Web.config
配置節(jié)處理程序:System.Web.SessionState.SessionStateSectionHandler
請(qǐng)參見
ASP.NET 配置 | ASP.NET 設(shè)置架構(gòu) | SessionStateModule
[出現(xiàn)原因:]在Windows2003的服務(wù)器中的IIS6加入了應(yīng)用程序池來回收一些無用的進(jìn)程的功能,當(dāng)由于網(wǎng)站程序的錯(cuò)誤或訪問量太多的導(dǎo)致的應(yīng)用程序池會(huì)自動(dòng)回收該進(jìn)程,防止網(wǎng)站進(jìn)入“死機(jī)”狀態(tài),而這時(shí)候的應(yīng)用程序池的回收就會(huì)導(dǎo)致session變量被清除,就出現(xiàn)了session變量不見的現(xiàn)象。
為了解決這種在Windows2003下才出現(xiàn)的問題,我們?cè)诜?wù)端起動(dòng)ASP.NET State Service服務(wù),并且在系統(tǒng)的machine.config做了一些改動(dòng)?,F(xiàn)在默認(rèn)的情況下會(huì)話狀態(tài)mode是StateServer。如果您的網(wǎng)站根目錄下也配有一個(gè)web.config配置文件,請(qǐng)把mode="InProc"改成mode="StateServer",如下代碼,就可以防止session變量的丟失:
<sessionState
mode="StateServer"
stateConnectionString="tcpip=127.0.0.1:42424"
sqlConnectionString="data source=127.0.0.1;Integrated Security=SSPI"
cookieless="false"
timeout="30"
/>
+ 注:只適用于支持asp.net的用戶。
轉(zhuǎn)(2):原因及一些解決之道
將Session保存在State Server里:
1.啟動(dòng)服務(wù)“ASP.NET State Service”,
2.然后,修改web.config:
<sessionState
mode="StateServer"
stateConnectionString="tcpip=127.0.0.1:42424"
sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"
cookieless="false"
timeout="140000"
/>
注意://mode="StateServer"這種模式下即使修改頁面也不會(huì)丟失session!
當(dāng)然:mode="InProc"如果你的模式為這種,修改頁面的時(shí)候會(huì)丟失session!!!!!!
在WebConfig里將Session的Mode設(shè)成SQLServer或者StateServer都不會(huì)丟Session的,
前者需要寫入數(shù)據(jù)庫,后者需要系統(tǒng)開StateServer服務(wù)。
原因1:
bin目錄中的文件被改寫,asp.net有一種機(jī)制,為了保證dll重新編譯之后,系統(tǒng)正常運(yùn)行,它會(huì)重新啟動(dòng)一次網(wǎng)站進(jìn)程,這時(shí)就會(huì)導(dǎo)致Session丟失,所以如果有access數(shù)據(jù)庫位于bin目錄,或者有其他文件被系統(tǒng)改寫,就會(huì)導(dǎo)致Session丟失。[目錄的刪除操作一定丟失session。asp.net的內(nèi)部機(jī)制對(duì)待目錄有點(diǎn)像個(gè)守財(cái)奴,它死守著目錄,你創(chuàng)建它不會(huì)管(往里加),一但創(chuàng)建他就會(huì)監(jiān)視該目錄,若你要?jiǎng)h除或重命名它的(動(dòng)它的目錄),它就發(fā)生重起了。。]
原因2:
文件夾選項(xiàng)中,如果沒有打開“在單獨(dú)的進(jìn)程中打開文件夾窗口”,一旦新建一個(gè)窗口,系統(tǒng)可能認(rèn)為是新的Session會(huì)話,而無法訪問原來的Session,所以需要打開該選項(xiàng),否則會(huì)導(dǎo)致Session丟失
原因3:
似乎大部分的Session丟失是客戶端引起的,所以要從客戶端下手,看看cookie有沒有打開
原因4:
Session的時(shí)間設(shè)置是不是有問題,會(huì)不會(huì)因?yàn)槌瑫r(shí)造成丟失。
[默認(rèn)時(shí)間是20分鐘,可以在Web.Config中設(shè)置Session的timeOut,如改為60分鐘等]
原因5:
IE中的cookie數(shù)量限制(每個(gè)域20個(gè)cookie)可能導(dǎo)致session丟失
原因6:
使用web garden模式,且使用了InProc mode作為保存session的方式
解決丟失的經(jīng)驗(yàn)
1. 判斷是不是原因1造成的,可以在每次刷新頁面的時(shí)候,跟蹤bin中某個(gè)文件的修改時(shí)間。
2. 做Session讀寫日志,每次讀寫Session都要記錄下來,并且要記錄SessionID、Session值、所在頁面、當(dāng)前函數(shù)、函數(shù)中的第幾次Session操作,這樣找丟失的原因會(huì)方便很多
3. 如果允許的話,建議使用state server或sql server保存session,這樣不容易丟失
4. 在global.asa中加入代碼記錄Session的創(chuàng)建時(shí)間和結(jié)束時(shí)間,超時(shí)造成的Session丟失是可以在SessionEnd中記錄下來的。
5. 如果有些代碼中使用客戶端腳本,如javascript維護(hù)Session狀態(tài),就要嘗試調(diào)試腳本,是不是因?yàn)槟_本錯(cuò)誤引起Session丟失。
轉(zhuǎn)(3):Session丟失原因與解決方案小結(jié)
可能的原因1:
win2003 server下的IIS6默認(rèn)設(shè)置下對(duì)每個(gè)運(yùn)行在默認(rèn)應(yīng)用池中的工作者進(jìn)程都會(huì)經(jīng)過20多個(gè)小時(shí)后自動(dòng)回收該進(jìn)程,造成保存在該進(jìn)程中的session丟失。
因?yàn)镾ession,Application等數(shù)據(jù)默認(rèn)保存在運(yùn)行該Web應(yīng)用程序的工作者進(jìn)程中,如果回收工作者進(jìn)程,則會(huì)造成丟失。
解決辦法:
修改配置,設(shè)置為不定時(shí)自動(dòng)回收該工作者進(jìn)程,比如設(shè)置為當(dāng)超出占用現(xiàn)有物理內(nèi)存60%后自動(dòng)回收該進(jìn)程。通過使用默認(rèn)應(yīng)用程序池,可以確保多個(gè)應(yīng)用程序間互相隔離,保證由于一個(gè)應(yīng)用程序的崩潰不會(huì)影響另外的Web應(yīng)用程序。還可以使一個(gè)獨(dú)立的應(yīng)用程序運(yùn)行在一個(gè)指定的用戶帳號(hào)特權(quán)之下。如果使用StateServer方式或者Sql Server數(shù)據(jù)庫方式來保存Session,則不受該設(shè)置的影響。
可能的原因2:
系統(tǒng)要運(yùn)行在負(fù)載平衡的 Web 場(chǎng)環(huán)境中,而系統(tǒng)配置文件web.config中的Session狀態(tài)卻設(shè)置為InProc(即在本地存儲(chǔ)會(huì)話狀態(tài)),導(dǎo)至在用戶訪問量大時(shí),Session常經(jīng)超時(shí)的情況。引起這個(gè)現(xiàn)象的原因主要是因?yàn)橛脩敉ㄟ^負(fù)載平衡IP來訪問WEB應(yīng)用系統(tǒng),某段時(shí)候在某臺(tái)服務(wù)器保存了Session的會(huì)話狀態(tài),但在其它的WEB前端服務(wù)器中卻沒有保存Session的會(huì)話狀態(tài),而隨著并發(fā)量的增大,負(fù)載平衡會(huì)當(dāng)作路由隨時(shí)訪問空閑的服務(wù)器,結(jié)果空閑的服務(wù)器并沒有之前保存的Session會(huì)話狀態(tài)。
解決辦法:
1.當(dāng)您在負(fù)載平衡的 Web 場(chǎng)環(huán)境中運(yùn)行 ASP.NET Web 應(yīng)用程序時(shí),一定要使用 SqlServer 或 StateServer 會(huì)話狀態(tài)模式,在項(xiàng)目中我們基于性能考慮并沒有選擇SqlServer模式來存儲(chǔ)Session狀態(tài),而是選擇一臺(tái)SessionStateServer 服務(wù)器來用戶的Session會(huì)話狀態(tài)。我們要在系統(tǒng)配置文件web.config中設(shè)置如下:
<sessionState
mode="StateServer" cookieless="false" timeout="240"
stateConnectionString="tcpip=192.168.0.1:42424" stateNetworkTimeout="14400" />
還要添加一項(xiàng)
<machineKey
validationKey="78AE3850338BFADCE59D8DDF58C9E4518E7510149C46142D7AAD7F1AD49D95D4" decryptionKey="5FC88DFC24EA123C" validation="SHA1"/>
2. 我們同時(shí)還要在SessionStateServer 服務(wù)器中啟動(dòng)ASP.NET State Service服務(wù),具體設(shè)置:控制面板>>管理工具>>服務(wù)>>ASP.NET State Service,把它設(shè)為自動(dòng)啟動(dòng)即可。
3. 每臺(tái)前端WEB服務(wù)的Microsoft“Internet 信息服務(wù)”(IIS)設(shè)置
要在 Web 場(chǎng)中的不同 Web 服務(wù)器間維護(hù)會(huì)話狀態(tài),Microsoft“Internet 信息服務(wù)”(IIS) 配置數(shù)據(jù)庫中 Web 站點(diǎn)的應(yīng)用程序路徑(例如,\LM\W3SVC\2)與 Web 場(chǎng)中所有 Web 服務(wù)器必須相同。大小寫也必須相同,因?yàn)閼?yīng)用程序路徑是區(qū)分大小寫的。在一臺(tái) Web 服務(wù)器上,承載 ASP.NET 應(yīng)用程序的 Web 站點(diǎn)的實(shí)例 ID 可能是 2(其中應(yīng)用程序路徑是 \LM\W3SVC\2)。在另一臺(tái) Web 服務(wù)器上,Web 站點(diǎn)的實(shí)例 ID 可能是 3(其中應(yīng)用程序路徑是 \LM\W3SVC\3)。因此,Web 場(chǎng)中的 Web 服務(wù)器之間的應(yīng)用程序路徑是不同的。我們必須使Web 場(chǎng)Web 站點(diǎn)的實(shí)例 ID 相同即可。你可以在IIS中把某一個(gè)WEB配置信息保存為一個(gè)文件,其他Web 服務(wù)器的IIS配置可以來自這一個(gè)文件。您如果想知道具體的設(shè)置請(qǐng)?jiān)L問Microsoft Support網(wǎng)站:
轉(zhuǎn)(4):丟失問題集錦
SessionState 的Timeout),其主要原因有三種。
一:有些殺病毒軟件會(huì)去掃描您的Web.Config文件,那時(shí)Session肯定掉,這是微軟的說法。
二:程序內(nèi)部里有讓Session掉失的代碼,及服務(wù)器內(nèi)存不足產(chǎn)生的。
三:程序有框架頁面和跨域情況。
第一種解決辦法是:使殺病毒軟件屏蔽掃描Web.Config文件(程序運(yùn)行時(shí)自己也不要去編輯它)
第二種是檢查代碼有無Session.Abandon()之類的。
第三種是在Window服務(wù)中將ASP.NET State Service 啟動(dòng)。
http://community.csdn.net/Expert/topic/3100/3100218.xml?temp=.4426386
還有可能就是你在測(cè)試期間改動(dòng)了,網(wǎng)站的文件。
下面是幫助中的內(nèi)容:
(ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpguide/html/cpconsessionstate.htm)
ASP.NET 提供一個(gè)簡(jiǎn)單、易于使用的會(huì)話狀態(tài)模型,您可以使用該模型跨多個(gè) Web 請(qǐng)求存儲(chǔ)任意數(shù)據(jù)和對(duì)象。
它使用基于字典的、內(nèi)存中的對(duì)象引用(這些對(duì)象引用存在于 IIS 進(jìn)程中)緩存來完成該操作。
使用進(jìn)程內(nèi)會(huì)話狀態(tài)模式時(shí)請(qǐng)考慮下面的限制:
使用進(jìn)程內(nèi)會(huì)話狀態(tài)模式時(shí),如果 aspnet_wp.exe 或應(yīng)用程序域重新啟動(dòng),則會(huì)話狀態(tài)數(shù)據(jù)將丟失。這些重新啟動(dòng)通常會(huì)在下面的情況中發(fā)生:
(1)在應(yīng)用程序的 Web.config 文件的 <processModel> 元素中,設(shè)置一個(gè)導(dǎo)致新進(jìn)程在條件被滿足時(shí)啟動(dòng)的屬性,例如 memoryLimit。
(2)修改 Global.asax 或 Web.config 文件。
(3)更改到 Web 應(yīng)用程序的 \Bin 目錄。
(4)用殺毒軟件掃描并修改 Global.asax 文件、Web.config 文件或 Web 應(yīng)用程序的 \Bin 目錄下的文件。
(5)如果在應(yīng)用程序的 Web.config 文件的 <processModel> 元素中啟用了網(wǎng)絡(luò)園模式,請(qǐng)不要使用進(jìn)程內(nèi)會(huì)話狀態(tài)模式。否則將發(fā)生隨機(jī)數(shù)據(jù)丟失。
我也碰到過。本機(jī)器上的Session或者Cookie丟失。
<sessionState
mode="StateServer"
stateConnectionString="tcpip=127.0.0.1:42424"
sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"
cookieless="false"
timeout="40"
/>
mode=""的三個(gè)屬性。本地/其他機(jī)器/sqlserver。
很多網(wǎng)絡(luò)架構(gòu),各個(gè)服務(wù)器之間都是通過一臺(tái)專門保存狀態(tài)的服務(wù)器(專門的狀態(tài)服務(wù)器)來保存比如說session,cookie..
我以前遇到這種問題,我用了以下幾個(gè)方法來解決?,F(xiàn)在也沒有這種情況發(fā)生了。
1、release,不要debug發(fā)布。
2、<sessionState cookieless="true" 把cookieless設(shè)為true。因?yàn)榭蛻舳私胏ookie時(shí),session也無效。
3、在IIS中把Session過期時(shí)間延長(zhǎng)。
4、讓殺毒軟件不掃描bin文件夾下的文件和Web.Config文件。
以上我是不明不白的做的。不過Session正常使用了!呵呵~~我幸運(yùn)!
沒啥好講的,不要用Session好了,直接用Forms認(rèn)證把,
我前兩天的系統(tǒng)就是用這個(gè)搞定的,覺得挺好的。
剛碰到一個(gè)類似的問題:在使用frameset的時(shí)候,session變量丟失。
在微軟的網(wǎng)站上找到了解決的方法
http://support.microsoft.com/kb/323752/EN-US/
不知道是否有用?
IIS--->>應(yīng)用程序連接池--->>屬性---->>[回收][性能][運(yùn)行狀況]里的各項(xiàng)參數(shù)盡量都往大的改^_^),我不知道改拉那個(gè)才對(duì)的,反正我改完后所有的session都好拉.客戶的網(wǎng)站和動(dòng)網(wǎng)論壇的后臺(tái)也跟著好拉。
轉(zhuǎn)(5): 模態(tài)窗口中打開新窗口的session丟失
一直被這個(gè)問題郁悶。在窗口A中使用showModalDialog()打開了一個(gè)新的模態(tài)窗口B。然后在B窗口中進(jìn)行一些業(yè)務(wù)操作,最后還需要根據(jù)業(yè)務(wù)操作打印一些表單,結(jié)果此時(shí)在B中調(diào)用open()方法就會(huì)出現(xiàn)session丟失的現(xiàn)象,提示用戶重新登陸。
兩天來一直沒頭蒼蠅一樣不停的試驗(yàn)各種方法。如果在這個(gè)窗口中采用打開非模態(tài)對(duì)話框的打開方法showModelessDialog()就沒有任何問題,但是直接使用open()方法就是不能達(dá)到想要的效果。在網(wǎng)上不停的google,到各大bbs尋找解答,提供的都是最簡(jiǎn)單的應(yīng)用。好不容易找到一篇文章,其中提到session對(duì)象的有效范圍,卻也沒有具體提到我遇到的問題:
IE中:
有效的窗品包括
1.Session對(duì)象只在建立Session對(duì)象的窗口中有效。
2.在建立Session對(duì)象的窗口中新開鏈接的窗口無效的窗口包括
1.直接啟動(dòng)IE瀏覽器的窗口
2.不是在建立Session對(duì)象的窗口中新開鏈接的窗口。(即作者在建立Session對(duì)象的A窗口彈出的B窗口上調(diào)用了open()方法。)
考慮只在建立session對(duì)象的窗口中有效,于是就在子窗口中重新使用session.setAttribute()方法,以為如此就可以成功,結(jié)果還是不行,郁悶。
早上起來突然來了靈感,既然子窗口中造成了session丟失,在父窗口中是無論如何還存在著session的變量的,我可以不必在子窗口中重新設(shè)置session變量,而可以直接調(diào)用父窗口的javascript函數(shù)open()方法可能會(huì)到目的吧。不管如何先試試,結(jié)果果然如此。 很多時(shí)候問題就是這樣的,想要偷懶,于是不自己鉆研,到處尋求解答,最后還是得靠自己來搞定。
轉(zhuǎn)載:http://blog.csdn.net/High_Mount/archive/2007/05/09/1601854.aspx
Tag標(biāo)簽: ASP.NET 狀態(tài)服務(wù) 及 session丟失問題解決方案總結(jié)