ASP.NET Session详解
生活随笔
收集整理的這篇文章主要介紹了
ASP.NET Session详解
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
原文 http://www.zxbc.cn/html/20090711/72153.html 當(dāng)用戶在 Web 應(yīng)用程序中導(dǎo)航 ASP.NET 頁(yè)時(shí),ASP.NET 會(huì)話狀態(tài)使您能夠存儲(chǔ)和檢索用戶的值。HTTP 是一種無(wú)狀態(tài)協(xié)議。這意味著 Web 服務(wù)器會(huì)將針對(duì)頁(yè)面的每個(gè) HTTP 請(qǐng)求作為獨(dú)立的請(qǐng)求進(jìn)行處理。服務(wù)器不會(huì)保留以前的請(qǐng)求過(guò)程中所使用的變量值的任何信息。 ASP.NET 會(huì)話狀態(tài)將來(lái)自限定時(shí)間范圍內(nèi)的同一瀏覽器的請(qǐng)求標(biāo)識(shí)為一個(gè)會(huì)話,當(dāng)每個(gè)用戶首次與這臺(tái)WWW服務(wù)器建立連接時(shí),他就與這個(gè)服務(wù)器建立了一個(gè)Session,同時(shí)服務(wù)器會(huì)自動(dòng)為其分配一個(gè)SessionID,用以標(biāo)識(shí)這個(gè)用戶的唯一身份。Session提供用于在該會(huì)話持續(xù)期間內(nèi)保留變量值的方法。默認(rèn)情況下,將為所有 ASP.NET 應(yīng)用程序啟用ASP.NET 會(huì)話狀態(tài). 會(huì)話變量可以是任何有效的 .NET Framework 類型, 注意:當(dāng)使用 InProc 以外的會(huì)話狀態(tài)模式時(shí),會(huì)話變量類型必須為基元 .NET 類型或可序列化的類型。這是因?yàn)闀?huì)話變量值存儲(chǔ)在外部數(shù)據(jù)存儲(chǔ)區(qū)中。 會(huì)話由一個(gè)唯一標(biāo)識(shí)符標(biāo)識(shí),可使用 SessionID 屬性讀取此標(biāo)識(shí)符。為 ASP.NET 應(yīng)用程序啟用會(huì)話狀態(tài)時(shí),將檢查應(yīng)用程序中每個(gè)頁(yè)面請(qǐng)求是否有瀏覽器發(fā)送的 SessionID 值。如果未提供任何 SessionID 值,則 ASP.NET 將啟動(dòng)一個(gè)新會(huì)話,并將該會(huì)話的 SessionID 值隨響應(yīng)一起發(fā)送到瀏覽器。 默認(rèn)情況下,SessionID 值存儲(chǔ)在 Cookie 中。但也可以將應(yīng)用程序配置為在“無(wú) Cookie”會(huì)話的 URL 中存儲(chǔ) SessionID 值。只要一直使用相同的 SessionID 值來(lái)發(fā)送請(qǐng)求,會(huì)話就被視為活動(dòng)的。如果特定會(huì)話的請(qǐng)求間隔超過(guò)指定的超時(shí)值(以分鐘為單位),則該會(huì)話被視為已過(guò)期。使用過(guò)期的 SessionID 值發(fā)送的請(qǐng)求將生成一個(gè)新的會(huì)話。 安全說(shuō)明: 無(wú)論是作為 Cookie 還是作為 URL 的一部分,System.Web.SessionState.HttpSessionState.SessionID 值都以明文的形式發(fā)送。惡意用戶通過(guò)獲取 SessionID 值并將其包含在對(duì)服務(wù)器的請(qǐng)求中,可以訪問(wèn)另一位用戶的會(huì)話。如果您將敏感信息存儲(chǔ)在會(huì)話狀態(tài)中,建議使用 SSL 來(lái)加密瀏覽器和服務(wù)器之間包含 SessionID 值的任何通信。 默認(rèn)情況下,SessionID 值存儲(chǔ)在瀏覽器的不過(guò)期會(huì)話 Cookie 中。但是,通過(guò)在 Web.config 文件的 sessionState 節(jié)中將 cookieless 屬性設(shè)置為 true,可以指定不應(yīng)將會(huì)話標(biāo)識(shí)符存儲(chǔ)在 Cookie 中。 ASP.NET 通過(guò)自動(dòng)在頁(yè)的 URL 中插入唯一的會(huì)話 ID 來(lái)保持無(wú) Cookie 會(huì)話狀態(tài)。例如,下面的 URL 已被 ASP.NET 修改,以包含唯一的會(huì)話 ID lit3py55t21z5v55vlm25s55: http://www.example.com/(S(lit3py55t21z5v55vlm25s55))/orderform.aspx 搭建Session服務(wù)器的幾種方式 將Session保存在獨(dú)立的服務(wù)器中可以實(shí)現(xiàn)在多臺(tái)Web服務(wù)器之間共享Session.雖然我們也可以自己開(kāi)發(fā)Session存儲(chǔ)系統(tǒng), 但是使用ASP.NET自帶的存儲(chǔ)機(jī)制將更加便捷. .NET提供了5種保存Seission的方式: 方式名稱 存儲(chǔ)方式 性能 Off 設(shè)置為不使用Session功能 無(wú) InProc 設(shè)置為將Session存儲(chǔ)在進(jìn)程內(nèi),就是ASP中的存儲(chǔ)方式,這是默認(rèn)值。 性能最高 StateServer 設(shè)置為將Session存儲(chǔ)在獨(dú)立的狀態(tài)服務(wù)中。通常是aspnet_state.exe進(jìn)程. 性能損失10-15% SQLServer 設(shè)置將Session存儲(chǔ)在SQL Server中。 性能損失10-20% Customer 自定制的存儲(chǔ)方案 由實(shí)現(xiàn)方式確定 我們可以在Web.Config中配置程序使用的Session存儲(chǔ)方式.默認(rèn)情況下是InProc, 即保存在IIS進(jìn)程中. 關(guān)于Off, InProc和Customer本文不做講解. 相關(guān)文章大家都可以在網(wǎng)上搜索到. 下面主要講解 StateServer 和 SQLServer 的應(yīng)用. 四.使用 StateServer 模式搭建Session服務(wù)器 (1)服務(wù)器端配置 1.啟動(dòng) Asp.net State service服務(wù).(這個(gè)服務(wù)默認(rèn)的狀態(tài)為手動(dòng).修改為自動(dòng)并啟動(dòng).) 2.修改注冊(cè)表: [HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\aspnet_state\Parameters] 設(shè)置 AllowRemoteConnection = 1 , 設(shè)置 Port = 42424 (十進(jìn)制,默認(rèn)即為42424) Port是服務(wù)的端口號(hào) AllowRemoteConnection 表示是否允許其他機(jī)器連接,0為僅能本機(jī)使用,1為可以供其他機(jī)器使用. (2)客戶端設(shè)置 在Web應(yīng)用程序的Web.Config中, 我們需要修改 / 的節(jié)點(diǎn).如果沒(méi)有 沒(méi)有則添加(默認(rèn)使用的是InProc方式) mode="StateServer" stateConnectionString="tcpip=服務(wù)器ip:42424" cookieless="false" timeout="60"/> 上面的參數(shù)我們可以根據(jù)需要修改. 五.使用SqlServer模式搭建Session服務(wù)器 (1)服務(wù)器端配置 使用SqlServer模式搭建Session服務(wù)器端有兩種方式. ASP.NET 1.0和1.1版本請(qǐng)使用方式a, 2.0即以上版本請(qǐng)使用方式b. a.使用SQL文件創(chuàng)建Session數(shù)據(jù)庫(kù) 在ASP.NET 1.0和1.1 版本中, 只能使用這種方式.對(duì)于2.0及其以上版本,請(qǐng)使用aspnet_regsql.exe工具.(當(dāng)然此方法也通用2.0版本) .net提供了數(shù)據(jù)庫(kù)安裝腳本,可以在機(jī)器的windows文件夾中找到: C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\ InstallSqlState.sql C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\ InstallSqlStateTemplate.sql 根據(jù)ASP.NET的版本不同, 需要使用不同的SQL腳本. ASP.NET主要有1.1和2.0兩個(gè)版本,可以在不同的版本文件夾找到這兩個(gè)SQL. InstallSqlState.sql 是創(chuàng)建默認(rèn)名稱的數(shù)據(jù)庫(kù)"[ASPState]".此SQL可以直接運(yùn)行. InstallSqlStateTemplate.sql 可以使用自己指定的數(shù)據(jù)庫(kù)保存數(shù)據(jù).此SQL需要自己修改后運(yùn)行, 打開(kāi)SQL文件將其中 [DatabaseNamePlaceHolder] 替換為自己指定的數(shù)據(jù)庫(kù)名稱. 執(zhí)行installsqlstate.sql時(shí)不需要指定數(shù)據(jù)庫(kù),可以在任意數(shù)據(jù)庫(kù)上執(zhí)行.此SQL會(huì)自己創(chuàng)建新的數(shù)據(jù)庫(kù) b. 使用aspnet_regsql.exe工具 ASP.NET 2.0版本后微軟提供了aspnet_regsql.exe工具可以方便的配置Session數(shù)據(jù)庫(kù).該工具位于 Web 服務(wù)器上的"系統(tǒng)根目錄\Microsoft.NET\Framework\版本號(hào)"文件夾中. 使用舉例: aspnet_regsql.exe -S . -U sa -P 123456 -ssadd -sstype p 例如: C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727>aspnet_regsql.exe -S . -U sa -P 7777777 -ssadd -sstype c -d chens(自定數(shù)據(jù)庫(kù)) -S參數(shù): 表示數(shù)據(jù)庫(kù)實(shí)例名稱. 可以用"."表示本機(jī). -U和-P參數(shù): 表示用戶名和密碼. -E參數(shù): 可以再-U –P 與 -E中選擇一組. –E表示以當(dāng)前系統(tǒng)用戶通過(guò)windows身份驗(yàn)證登錄數(shù)據(jù)庫(kù), -U -P則是使用SqlServer用戶登錄數(shù)據(jù)庫(kù). -ssadd / –ssremove 參數(shù): -ssadd表示是添加Session數(shù)據(jù)庫(kù), -ssremove表示移除Session數(shù)據(jù)庫(kù). sstype 參數(shù): 選項(xiàng) 說(shuō)明 t 將會(huì)話數(shù)據(jù)存儲(chǔ)到 SQL Server tempdb 數(shù)據(jù)庫(kù)中。這是默認(rèn)設(shè)置。如果將會(huì)話數(shù)據(jù)存儲(chǔ)到 tempdb 數(shù)據(jù)庫(kù)中,則在重新啟動(dòng) SQL Server 時(shí)將丟失會(huì)話數(shù)據(jù)。 p 將會(huì)話數(shù)據(jù)存儲(chǔ)到 ASPState 數(shù)據(jù)庫(kù)中,而不是存儲(chǔ)到 tempdb 數(shù)據(jù)庫(kù)中。 c 將會(huì)話數(shù)據(jù)存儲(chǔ)到自定義數(shù)據(jù)庫(kù)中。如果指定 c 選項(xiàng),則還必須使用 -d 選項(xiàng)包括自定義數(shù)據(jù)庫(kù)的名稱。 (2)Session客戶端設(shè)置 此房是同樣需要Web應(yīng)用程序修改Web.Config中的節(jié)點(diǎn).如果使用默認(rèn)的數(shù)據(jù)庫(kù)(ASPState庫(kù)), 則配置如下: 如果使用了自定義的數(shù)據(jù)庫(kù)名稱,則還需要制定allowCustomSqlDatabase屬性并在數(shù)據(jù)庫(kù)連接串中指定數(shù)據(jù)庫(kù): 六.使用經(jīng)驗(yàn)與技巧總結(jié) 下面是SessionID, Session_End時(shí)間, StatServer模式 和 SqlServer模式的各種經(jīng)驗(yàn)和技巧總結(jié). (1)StateServer模式: 1.在web farm中,請(qǐng)確認(rèn)在所有的web服務(wù)器上有相同的 2. 要保存在Session中的對(duì)象是可序列化的。 3.為了在web farm中的不同web服務(wù)器上維護(hù)session state,IIS Metabase中的網(wǎng)站應(yīng)用程序路徑(如\LM\W3SVC\2)應(yīng)該在所有的服務(wù)器上保持一致(大小寫(xiě)敏感). 4. ASP.NET處理Session是在Machine.Config中配置的HttpModuel模塊, 在.NET的安裝目錄下的Config文件夾中, 查看Web.Config(1.1版本是在Machine.Config): ... ... 確認(rèn)此模塊是否存在. 5.StateServer不支持負(fù)載均衡, 所以如果大并發(fā)推薦使用SqlServer模式, 可以享受到SqlServer的高性能和安全性.雖然存儲(chǔ)效率會(huì)有下降. 6.需要讓所有機(jī)器的MachineKey相同.在Machine.Config中配置: (2)SqlServer模式: 1. 要保存在Session中的對(duì)象是可序列化的。 2. 如果使用了默認(rèn)是數(shù)據(jù)庫(kù), 則在客戶端配置文件中的數(shù)據(jù)庫(kù)鏈接字符串的用戶,需要擁有ASPState和tempdb兩個(gè)庫(kù)的dbowner權(quán)限. 3. 在SQLServer模式下,session過(guò)期是由SQL Agent使用一個(gè)注冊(cè)任務(wù)完成的,要確認(rèn)SQL Agent已經(jīng)運(yùn)行。否則無(wú)法清理過(guò)期的Session數(shù)據(jù), 會(huì)導(dǎo)致數(shù)據(jù)庫(kù)數(shù)據(jù)一直增加. 4. 如果使用SqlServer模式時(shí), 對(duì)于Web場(chǎng)中的各服務(wù)器的 ASP.NET 應(yīng)用程序路徑必須是相同的。請(qǐng)?jiān)?IIS 配置數(shù)據(jù)庫(kù)中對(duì) Web 場(chǎng)中的所有 Web 服務(wù)器進(jìn)行 Web 站點(diǎn)的應(yīng)用程序路徑同步。大小寫(xiě)一定要相同,因?yàn)?Web 站點(diǎn)的應(yīng)用程序路徑是區(qū)分大小寫(xiě)的。 5.需要讓所有機(jī)器的MachineKey相同.在Machine.Config中配置: (3)Session: 1. 不能直接通過(guò)Session服務(wù)器在ASP.NET和ASP之間共享Session. 請(qǐng)使用微軟提供的解決方案: http://msdn.microsoft.com/zh-cn/library/aa479313.aspx 2. 在不同的應(yīng)用程序或一個(gè)網(wǎng)站的不同虛擬目錄之間無(wú)法共享Session 3. Session的過(guò)期時(shí)間是滑動(dòng)時(shí)間. 4. Session存儲(chǔ).NET自帶的值類型性能最優(yōu). 存儲(chǔ)對(duì)象會(huì)降低性能. (4)SessionID: 1.SessionID 還可以保存在URL上, 設(shè)置Web.Config文件中的System.Web/sessionState節(jié)點(diǎn)的Cookiesless屬性即可: 2. 一般在Session超時(shí)或刪除之后,SessionID保持不變. 因?yàn)镾ession過(guò)期后會(huì)在服務(wù)器端清除數(shù)據(jù), 但是SessionID保存在用戶瀏覽器上, 所以只要瀏覽器不關(guān)閉則HTTP頭中的SessionID保持不變. 3.關(guān)閉瀏覽器后再訪問(wèn), SessionID會(huì)不同. 4.每打開(kāi)一個(gè)IE6窗口, SessionID都不同, 在IE6中兩個(gè)窗口的Session不能共享. 5.FireFox的標(biāo)簽頁(yè)和新的FireFox窗口, SessionID都相同, 在FF的窗口和標(biāo)簽頁(yè)上Session能共享. 6.對(duì)于包含F(xiàn)rameSet的頁(yè)面,比如: 如果后綴名是.htm并且.htm文件沒(méi)有交給ASP.NET的ISAPI處理, 那么根據(jù)服務(wù)器速度在每個(gè)Frame頁(yè)面生成不同的SessionID, 再刷新后相同都等于最后一個(gè)SessionID. 解決辦法是將.htm后綴改成.aspx, 或者將.htm文件交給ASP.NET的ISAPI處理. (5)Session_End事件: 1. Session_End僅在InProc模式中可用 2. 關(guān)閉瀏覽器,Session_End是不會(huì)觸發(fā)的。HTTP是一種無(wú)狀態(tài)協(xié)議,服務(wù)器沒(méi)有辦法知道你的瀏覽器是否已經(jīng)關(guān)閉。 3. 當(dāng)Session因?yàn)闀r(shí)間過(guò)期或調(diào)用Session.Abandon時(shí),Session_End才會(huì)觸發(fā).Session.Clear()僅僅是清除數(shù)據(jù),但沒(méi)有刪除session。 4. Session_End由一個(gè)后臺(tái)線程觸發(fā),使用工作者進(jìn)程賬號(hào)運(yùn)行. 所以程序不會(huì)通知發(fā)生的錯(cuò)誤. 5. 在Session_End訪問(wèn)數(shù)據(jù)庫(kù)要考慮權(quán)限問(wèn)題. Session_End是用運(yùn)行工作者進(jìn)程(aspnet_wp.exe)的帳號(hào)運(yùn)行的,這個(gè)賬號(hào)可以在machine.config中指定。因此,在Session_End中,如果使用integrity security連接SQL,它將使用工作者進(jìn)程賬號(hào)身份連接,這可能會(huì)引起登錄失敗. 6.因?yàn)镾ession_End是有獨(dú)立線程出發(fā)的, 所以在Session_End中無(wú)法使用HttpContext對(duì)象(Request,Response,Server等對(duì)象都在HttpContext中), 即無(wú)法使用 Response.Redirect 和Server.Transfer等方法. 七.總結(jié) 我已經(jīng)使用SqlServer模式對(duì)公司的多臺(tái)服務(wù)器實(shí)現(xiàn)了Session共享, 服務(wù)器重啟也不會(huì)導(dǎo)致用戶預(yù)定過(guò)程重新開(kāi)始(預(yù)定過(guò)程需要的Session不會(huì)丟失). 希望本文對(duì)具體的Session服務(wù)器搭建人員有所幫助.
轉(zhuǎn)載于:https://www.cnblogs.com/ableid/archive/2009/10/28/1591316.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的ASP.NET Session详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 现在红眼还适合做鲁莽9件吗?
- 下一篇: 我的处女作《设计模式之禅》——前言