ASP.NET session.timeout設(shè)置案例詳解
session.timeout
方法一:
asp.net Session的默認(rèn)時(shí)間設(shè)置是20分鐘,即超過(guò)20分鐘后,服務(wù)器會(huì)自動(dòng)放棄Session信息.
當(dāng)我們?cè)赼sp.net程序中打開(kāi)webconfig的時(shí)候,可以看到一段如下的代碼:Asp.net程序代碼: sessionState節(jié)點(diǎn)放在<system.web>節(jié)點(diǎn)下,形式如下:
- configuration 元素(常規(guī)設(shè)置架構(gòu))
- system.web 元素(ASP.NET 設(shè)置架構(gòu))
- sessionState 元素(ASP.NET 設(shè)置架構(gòu))
<sessionState mode="InProc" stateConnectionString="tcpip=127.0.0.1:42424" sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes" cookieless="false" timeout="20" />
上面一段的代碼就是配置應(yīng)用程序是如何存儲(chǔ)Session信息的了.其中的timeout="20" 即為asp.net session的默認(rèn)時(shí)間.需要更改時(shí)間我們?cè)诖颂幪钌喜煌臄?shù)值就可以了,默認(rèn)單位為分.
sessionState節(jié)點(diǎn)屬性:
<sessionState mode="Off|InProc|StateServer|SQLServer" cookieless="true|false" timeout="number of minutes" stateConnectionString="tcpip=server:port" sqlConnectionString="sql connection string" stateNetworkTimeout="number of seconds" />
必須有的屬性是
mode 設(shè)置將Session信息存儲(chǔ)到哪里
Off 設(shè)置為不使用Session功能
InProc 設(shè)置為將Session存儲(chǔ)在進(jìn)程內(nèi),就是ASP中的存儲(chǔ)方式,這是默認(rèn)值。
StateServer 設(shè)置為將Session存儲(chǔ)在獨(dú)立的狀態(tài)服務(wù)中。
SQLServer 設(shè)置將Session存儲(chǔ)在SQL Server中
可選的屬性是:
cookieless 設(shè)置客戶(hù)端的Session信息存儲(chǔ)到哪里
ture 使用Cookieless模式
false 使用Cookie模式,這是默認(rèn)值。
timeout 設(shè)置經(jīng)過(guò)多少分鐘后服務(wù)器自動(dòng)放棄Session信息。默認(rèn)為20分鐘
stateConnectionString 設(shè)置Session信息存儲(chǔ)在狀態(tài)服務(wù)中時(shí)使用的服務(wù)器名稱(chēng)和端口號(hào),例如:"tcpip=127.0.0.1:42424”。當(dāng)mode的值是StateServer是,這個(gè)屬性是必需的。
sqlConnectionString 設(shè)置與SQL Server連接時(shí)的連接字符串。當(dāng)mode的值是SQLServer時(shí),這個(gè)屬性是必需的。
stateNetworkTimeout 設(shè)置當(dāng)使用StateServer模式存儲(chǔ)Session狀態(tài)時(shí),經(jīng)過(guò)多少秒空閑后,斷開(kāi)Web服務(wù)器與存儲(chǔ)狀態(tài)信息的服務(wù)器的TCP/IP連接的。默認(rèn)值是10秒
ASP.NET session時(shí)間的設(shè)置方法二:
不過(guò)有時(shí)修改配置文件不能很好的解決這個(gè)問(wèn)題。你可以在公共程序里Global.asax里修改。我們?cè)谡业絞lobal.asax中找到 Session_Start后 按如下設(shè)置一下就可以了。
void Session_Start(object sender, EventArgs e) { // 在新會(huì)話啟動(dòng)時(shí)運(yùn)行的代碼 Session.Timeout = 600; }
ASP.NET中客戶(hù)端Session狀態(tài)的存儲(chǔ)
在我們上面的Session模型簡(jiǎn)介中,大家可以發(fā)現(xiàn)Session狀態(tài)應(yīng)該存儲(chǔ)在兩個(gè)地方,分別是客戶(hù)端和服務(wù)器端。客戶(hù)端只負(fù)責(zé)保存相應(yīng)網(wǎng)站的SessionID,而其他的Session信息則保存在服務(wù)器端。在ASP中,客戶(hù)端的SessionID實(shí)際是以Cookie的形式存儲(chǔ)的。如果用戶(hù)在瀏覽器的設(shè)置中選擇了禁用Cookie,那末他也就無(wú)法享受Session的便利之處了,甚至造成不能訪問(wèn)某些網(wǎng)站。為了解決以上問(wèn)題,在ASP.NET中客戶(hù)端的Session信息存儲(chǔ)方式分為:Cookie和Cookieless兩種。
ASP.NET中,默認(rèn)狀態(tài)下,在客戶(hù)端還是使用Cookie存儲(chǔ)Session信息的。如果我們想在客戶(hù)端使用Cookieless的方式存儲(chǔ)Session信息的方法如下:
找到當(dāng)前Web應(yīng)用程序的根目錄,打開(kāi)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" />
這段話中的cookieless="false"改為:cookieless="true",這樣,客戶(hù)端的Session信息就不再使用Cookie存儲(chǔ)了,而是將其通過(guò)URL存儲(chǔ)。關(guān)閉當(dāng)前的IE,打開(kāi)一個(gè)新IE,重新訪問(wèn)剛才的Web應(yīng)用程序,就會(huì)看到類(lèi)似下面的樣子:
其中,http://localhost/MyTestApplication/(ulqsek45heu3ic2a5zgdl245)/default.aspx中黑體標(biāo)出的就是客戶(hù)端的Session ID。注意,這段信息是由IIS自動(dòng)加上的,不會(huì)影響以前正常的連接。
ASP.NET中服務(wù)器端Session狀態(tài)的存儲(chǔ)
準(zhǔn)備工作
為了您能更好的體驗(yàn)到實(shí)驗(yàn)現(xiàn)象,您可以建立一個(gè)叫做SessionState.aspx的頁(yè)面,然后把以下這些代碼添加到< body>< /body>中。
< scriptrunat="server"> Sub Session_Add(sender As Object, e As EventArgs) Session("MySession") = text1.Value span1.InnerHtml = "Session data updated! < P>Your session contains: < font color=red>" & Session("MySession").ToString() & "< /font>" End Sub Sub CheckSession(sender As Object, eAs EventArgs) If (Session("MySession")Is Nothing) Then span1.InnerHtml = "NOTHING, SESSION DATA LOST!" Else span1.InnerHtml = "Your session contains: < font color=red>" & Session("MySession").ToString() & "< /font>" End If End Sub < /script> < formrunat="server"id="Form2"> < inputid="text1"type="text"runat="server"name="text1"> < inputtype="submit"runat="server"OnServerClick="Session_Add" value="Add to Session State" id="Submit1"name="Submit1"> < inputtype="submit"runat="server"OnServerClick="CheckSession" value="View Session State" id="Submit2"name="Submit2"> < /form> < hrsize="1"> < fontsize="6">< spanid="span1"runat="server" />< /font>
這個(gè)SessionState.aspx的頁(yè)面可以用來(lái)測(cè)試在當(dāng)前的服務(wù)器上是否丟失了Session信息。
將服務(wù)器Session信息存儲(chǔ)在進(jìn)程中
讓我們來(lái)回到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" />
當(dāng)mode的值是InProc時(shí),說(shuō)明服務(wù)器正在使用這種模式。
這種方式和以前ASP中的模式一樣,就是服務(wù)器將Session信息存儲(chǔ)在IIS進(jìn)程中。當(dāng)IIS關(guān)閉、重起后,這些信息都會(huì)丟失。但是這種模式也有自己最大好處,就是性能最高。應(yīng)為所有的Session信息都存儲(chǔ)在了IIS的進(jìn)程中,所以IIS能夠很快的訪問(wèn)到這些信息,這種模式的性能比進(jìn)程外存儲(chǔ)Session信息或是在SQL Server中存儲(chǔ)Session信息都要快上很多。這種模式也是ASP.NET的默認(rèn)方式。
好了,現(xiàn)在讓我們做個(gè)試驗(yàn)。打開(kāi)剛才的SessionState.aspx頁(yè)面,隨便輸入一些字符,使其存儲(chǔ)在Session中。然后,讓我們讓IIS重起。注意,并不是使當(dāng)前的站點(diǎn)停止再開(kāi)始,而是在IIS中本機(jī)的機(jī)器名的節(jié)點(diǎn)上點(diǎn)擊鼠標(biāo)右鍵,選擇重新啟動(dòng)IIS。(想當(dāng)初使用NT4時(shí),重新啟動(dòng)IIS必須要重新啟動(dòng)計(jì)算機(jī)才行,微軟真是@#$%^&)返回到SessionState.aspx頁(yè)面中,檢查剛才的Session信息,發(fā)現(xiàn)信息已經(jīng)丟失了。
將服務(wù)器Session信息存儲(chǔ)在進(jìn)程外
首先,讓我們來(lái)打開(kāi)管理工具->服務(wù),找到名為:ASP.NET State Service的服務(wù),啟動(dòng)它。實(shí)際上,這個(gè)服務(wù)就是啟動(dòng)一個(gè)要保存Session信息的進(jìn)程。啟動(dòng)這個(gè)服務(wù)后,你可以從Windows任務(wù)管理器->進(jìn)程中看到一個(gè)名為aspnet_state.exe的進(jìn)程,這個(gè)就是我們保存Session信息的進(jìn)程。
然后,回到Web.config文件中上述的段落中,將mode的值改為StateServer。保存文件后的重新打開(kāi)一個(gè)IE,打開(kāi)SessionState.aspx頁(yè)面,保存一些信息到Session中。這時(shí),讓我們重起IIS,再回到SessionState.aspx頁(yè)面中查看剛才的Session信息,發(fā)現(xiàn)沒(méi)有丟失。
實(shí)際上,這種將Session信息存儲(chǔ)在進(jìn)程外的方式不光指可以將信息存儲(chǔ)在本機(jī)的進(jìn)程外,還可以將Session信息存儲(chǔ)在其他的服務(wù)器的進(jìn)程中。這時(shí),不光需要將mode的值改為StateServer,還需要在stateConnectionString中配置相應(yīng)的參數(shù)。例如你的計(jì)算你是192.168.0.1,你想把Session存儲(chǔ)在IP為192.168.0.2的計(jì)算機(jī)的進(jìn)程中,就需要設(shè)置成這樣:stateConnectionString="tcpip=192.168.0.2:42424"。當(dāng)然,不要忘記在192.168.0.2的計(jì)算機(jī)中裝上.NET Framework,并且啟動(dòng)ASP.NET State Services服務(wù)。
將服務(wù)器Session信息存儲(chǔ)在SQL Server中
首先,還是讓我們來(lái)做一些準(zhǔn)備工作。啟動(dòng)SQL Server和SQL Server代理服務(wù)。在SQL Server中執(zhí)行一個(gè)叫做InstallSqlState.sql的腳本文件。這個(gè)腳本文件將在SQL Server中創(chuàng)建一個(gè)用來(lái)專(zhuān)門(mén)存儲(chǔ)Session信息的數(shù)據(jù)庫(kù),及一個(gè)維護(hù)Session信息數(shù)據(jù)庫(kù)的SQL Server代理作業(yè)。我們可以在以下路徑中找到那個(gè)文件:
[system drive]\winnt\Microsoft.NET\Framework\[version]\
然后打開(kāi)查詢(xún)分析器,連接到SQL Server服務(wù)器,打開(kāi)剛才的那個(gè)文件并且執(zhí)行。稍等片刻,數(shù)據(jù)庫(kù)及作業(yè)就建立好了。這時(shí),你可以打開(kāi)企業(yè)管理器,看到新增了一個(gè)叫ASPState的數(shù)據(jù)庫(kù)。但是這個(gè)數(shù)據(jù)庫(kù)中只是些存儲(chǔ)過(guò)程,沒(méi)有用戶(hù)表。實(shí)際上Session信息是存儲(chǔ)在了tempdb數(shù)據(jù)庫(kù)的ASPStateTempSessions表中的,另外一個(gè)ASPStateTempApplications表存儲(chǔ)了ASP中Application對(duì)象信息。這兩個(gè)表也是剛才的那個(gè)腳本建立的。另外查看管理->SQL Server代理->作業(yè),發(fā)現(xiàn)也多了一個(gè)叫做ASPState_Job_DeleteExpiredSessions的作業(yè),這個(gè)作業(yè)實(shí)際上就是每分鐘去ASPStateTempSessions表中刪除過(guò)期的Session信息的。
接著,我們返回到Web.config文件,修改mode的值改為SQLServer。注意,還要同時(shí)修改sqlConnectionString的值,格式為:
sqlConnectionString="data source=localhost; Integrated Security=SSPI;"
其中data source是指SQL Server服務(wù)器的IP地址,如果SQL Server與IIS是一臺(tái)機(jī)子,寫(xiě)127.0.0.1就行了。Integrated Security=SSPI的意思是使用Windows集成身份驗(yàn)證,這樣,訪問(wèn)數(shù)據(jù)庫(kù)將以ASP.NET的身份進(jìn)行,通過(guò)如此配置,能夠獲得比使用userid=sa;password=口令的SQL Server驗(yàn)證方式更好的安全性。當(dāng)然,如果SQL Server運(yùn)行于另一臺(tái)計(jì)算機(jī)上,你可能會(huì)需要通過(guò)Active Directory域的方式來(lái)維護(hù)兩邊驗(yàn)證的一致性。
同樣,讓我們做個(gè)試驗(yàn)。向SessionState.aspx中添加Session信息,這時(shí)發(fā)現(xiàn)Session信息已經(jīng)存在SQL Server中了,即使你重起計(jì)算機(jī),剛才的Session信息也不會(huì)丟失?,F(xiàn)在,你已經(jīng)完全看見(jiàn)了Session信息到底是什么樣子的了,而且又是存儲(chǔ)在SQL Server中的,能干什么就看你的發(fā)揮了,哈哈。
總結(jié)
通過(guò)這篇文章,你可以看到在Session的管理和維護(hù)上,ASP.NET比ASP有了很大的進(jìn)步,我們可以更加隨意的挑選適合的方法了。對(duì)于企業(yè)級(jí)的應(yīng)用來(lái)說(shuō),這無(wú)疑對(duì)于服務(wù)器的同步、服務(wù)器的穩(wěn)定性、可靠性都是有利的。相信在強(qiáng)大的微軟支持下,新一代的電子商務(wù)平臺(tái)將會(huì)搭建的更好!
同時(shí),大家也會(huì)發(fā)現(xiàn),在這個(gè)整個(gè)技術(shù)中包括了操作系統(tǒng)、Web服務(wù)及數(shù)據(jù)庫(kù)多種技術(shù)的整合。我相信,也許Windows沒(méi)有Unix穩(wěn)定,IIS沒(méi)有Apache穩(wěn)定,SQL Server也沒(méi)有Oracle強(qiáng)大,但是,誰(shuí)可以將他們?nèi)绱送昝赖穆?lián)動(dòng)到一起呢?所以說(shuō),雖然微軟每一方面都不是太強(qiáng),但是如果把微軟的東西都整合到一起,誰(shuí)敢說(shuō)他不強(qiáng)大呢?微軟就是微軟
到此這篇關(guān)于ASP.NET session.timeout設(shè)置案例詳解的文章就介紹到這了,更多相關(guān)ASP.NET session.timeout設(shè)置內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
.Net Core中自定義認(rèn)證實(shí)現(xiàn)
本文主要介紹了.Net Core中自定義認(rèn)證實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01ASP.NET設(shè)計(jì)網(wǎng)絡(luò)硬盤(pán)之下載或在線查看實(shí)現(xiàn)代碼
在目錄瀏覽中,如果選擇的是一個(gè)文件,單擊“打開(kāi)”按鈕就可以進(jìn)行文件下載2012-10-10asp.net Datalist控件實(shí)現(xiàn)分頁(yè)功能
asp.net Datalist控件實(shí)現(xiàn)分頁(yè)功能代碼。大家可以參考下。2009-07-07代碼實(shí)現(xiàn)打印功能(asp.net+javascript)
頁(yè)面實(shí)現(xiàn)打印的效果代碼,分為服務(wù)器端和客戶(hù)端單個(gè)即可,客戶(hù)端的比較不錯(cuò),本站也是類(lèi)似的方法。2009-05-05asp.net MVC實(shí)現(xiàn)簡(jiǎn)單的上傳功能
MVC中上傳變得越來(lái)越容易,可是對(duì)于新手這個(gè)也還是不知道如何實(shí)現(xiàn),以下方式實(shí)現(xiàn)MVC的上傳功能,以下2種方法都是可以實(shí)現(xiàn)的,其中的代碼參考了藍(lán)色小鋪和重典的文章。2009-11-11ASP.NET實(shí)現(xiàn)QQ、微信、新浪微博OAuth2.0授權(quán)登錄
本文主要介紹了QQ、微信、新浪微博OAuth2.0授權(quán)登錄的示例,主要就是GET、POST遠(yuǎn)程接口,返回相應(yīng)的數(shù)據(jù),這里列出相關(guān)的代碼,供大家參考。2016-03-03