曹守富
(湖南廣播電視大學(xué),湖南長沙 410004)
ASP.NET應(yīng)用中會話狀態(tài)丟失及解決策略
曹守富*
(湖南廣播電視大學(xué),湖南長沙 410004)
在開發(fā)和使用基于ASP.NET技術(shù)的B/S模式應(yīng)用系統(tǒng)時,經(jīng)常會遇到會話狀態(tài)丟失的情況。產(chǎn)生這種情況的原因因系統(tǒng)環(huán)境或者應(yīng)用程序配置的不同而不同。本文首先介紹ASP.NET中的會話,然后歸納會話丟失情況并分析原因,給出相應(yīng)的解決策略。
會話狀態(tài);會話超時;會話丟失
ASP.NET應(yīng)用程序的會話表示用戶在與該站點(diǎn)連接期間發(fā)送的所有請求,會話狀態(tài)是用戶在會話期間生成和使用的持久性數(shù)據(jù)的集合。每個會話的狀態(tài)都彼此獨(dú)立,在用戶會話結(jié)束時將不復(fù)存在。默認(rèn)情況下,站點(diǎn)的會話狀態(tài)保存時間是20分鐘。ASP.NET內(nèi)置了會話狀態(tài)操作的對象,使用ASP.NET內(nèi)置的會話對象,可以使我們做到:對從單個瀏覽器客戶端到服務(wù)器上的應(yīng)用程序會話的請求通過會話標(biāo)識(Session ID)進(jìn)行自動識別,將會話有效期內(nèi)保存的數(shù)據(jù)存儲在服務(wù)器上以供跨多個頁面請求時使用。
1.會話狀態(tài)存儲
ASP.NET中會話狀態(tài)的保存方式可通過設(shè)置web.config文件中<sessionState>標(biāo)記的屬性進(jìn)行設(shè)置,標(biāo)記中的mode屬性決定了會話的存儲方式,主要有以下三種取值:
InProc(默認(rèn)):會話狀態(tài)以活動對象方式存儲在ASP.NET進(jìn)程(IIS5是 aspnet_wp.exe,而 IIS6是 w3wp.exe)中。配置代碼如下:
StateServer:進(jìn)程外存儲,會話狀態(tài)被序列化后存儲到某一臺計算機(jī)的內(nèi)存中,需要在這臺計算機(jī)上啟動ASP.NET State Service服務(wù)。配置代碼如下:
SQLServer:進(jìn)程外存儲,會話狀態(tài)被序列化后存儲在SQL Server數(shù)據(jù)庫中。配置代碼如下:
2.會話狀態(tài)丟失原因及解決策略
圖1
在單一Web服務(wù)器情況下,我們一般將會話存儲方式設(shè)置為InProc。在這種設(shè)置方式下,會話狀態(tài)存儲在ASP.NET進(jìn)程內(nèi),以下情況都會導(dǎo)致會話狀態(tài)丟失。一是當(dāng)殺毒軟件掃描應(yīng)用程序中的Web.config文件時會話狀態(tài)會丟失,為避免這種情況,需要使殺病毒軟件屏蔽掃描Web.config文件。二是Web.config文件或者應(yīng)用程序生成后的DLL文件被修改時,應(yīng)用程序會被重新加載,此時會話狀態(tài)也會丟失。因此修改這兩個文件應(yīng)避免訪問量高峰時間段。三是設(shè)置應(yīng)用程序池內(nèi)性能的最大web進(jìn)程數(shù)大于1時將會啟動多個進(jìn)程處理用戶的請求,由于不同進(jìn)程間會話狀態(tài)不能共享,而導(dǎo)致會話狀態(tài)丟失。這種情況下會話狀態(tài)存儲方式就要選擇StateServer或者SQLServer。四是<sessionState>標(biāo)記中cookieless屬性值設(shè)置為false,需要客戶端瀏覽器啟用Cookie(默認(rèn)情況下是啟用的),否則會話狀態(tài)會丟失。五是修改配置,設(shè)置為不定時自動回收該工作者進(jìn)程,比如設(shè)置為當(dāng)超出占用現(xiàn)有物理內(nèi)存60%后自動回收該進(jìn)程。通過使用應(yīng)用程序池,可以確保多個應(yīng)用程序間互相隔離,保證由于一個Web應(yīng)用程序的崩潰不會影響另外的Web應(yīng)用程序。如圖1所示,Test.htm頁面采用框架結(jié)構(gòu)。由于該框架集頁面是HMTL頁面,第一次被請求時不會獲得任何會話信息,而其中包含的框架頁1和框架頁2兩個ASPX頁面會被單獨(dú)請求,每個頁面將會獲得不同的Session ID,這樣就導(dǎo)致了客戶端獲取的會話狀態(tài)不一致而引起會話狀態(tài)的丟失。解決這個問題的辦法是采用圖2所示的方法,將框架集頁面轉(zhuǎn)換為ASPX頁面。
圖2
圖3
在應(yīng)用系統(tǒng)訪問量大的情況下,采用Web Farm構(gòu)架系統(tǒng)來實現(xiàn)負(fù)載均衡,如圖3所示。域名px.hnrti.com綁定到220.168.40.191 和 220.168.40.191 兩臺 Web 服務(wù)器地址上,當(dāng)用戶在瀏覽器的地址欄輸入px.hnrti.com時,域名將動態(tài)的解析到其中某一臺Web服務(wù)器。此時,如果系統(tǒng)開發(fā)人員對會話狀態(tài)未做任何配置,系統(tǒng)投入使用后,會話狀態(tài)很容易丟失。丟失原因除了上述“單一Web服務(wù)器環(huán)境”外,還有Web Fram環(huán)境固有的。
我們假設(shè)應(yīng)用程序中有這兩個頁面ListInfo.aspx和ViewInfo.aspx,在這兩個頁面中都要使用會話狀態(tài),在訪問并發(fā)量的增大的情況下,同一用戶請求ListInfo.aspx和ViewInfo.aspx頁面時,兩次解析到的服務(wù)器地址可能不同,默認(rèn)情況下會話狀態(tài)都是存儲在本地服務(wù)器上,這樣就會出現(xiàn)雖然一個服務(wù)器上存儲了會話狀態(tài),但另外一個服務(wù)器沒有存儲的情況,此時使用的會話狀態(tài)就會丟失。針對這種情況,根據(jù)存儲方式不同我們可以采用以下解決策略:
將會話狀態(tài)存儲方式設(shè)置為StateServer,配置代碼舉例如下:
其中timeout指定了會話狀態(tài)有效時間,單位是分鐘,tcpip指定了會話存儲的服務(wù)器IP地址和端口號。也就是我們將會話狀態(tài)信息專門存儲在某一臺服務(wù)器上,在這種模式下,需要啟用存儲會話狀態(tài)服務(wù)器上的“ASP.NET狀態(tài)服務(wù)”,由這個服務(wù)維護(hù)會話狀態(tài),這樣只有這臺服務(wù)系統(tǒng)中的ASP.NET狀態(tài)服務(wù)停止或者會話服務(wù)器與Web服務(wù)器網(wǎng)絡(luò)斷開,會話狀態(tài)才會丟失。
將會話狀態(tài)存儲方式設(shè)置為SQLServer,配置代碼舉例如下:
其中sqlConnectionString是連接數(shù)據(jù)庫的連接字符串。這樣將會話狀態(tài)就存儲在了Sql Server數(shù)據(jù)庫中,此時需要啟動Sql Server服務(wù)器上的系統(tǒng)服務(wù)SQL Agent。
將會話狀態(tài)存儲方式設(shè)置為InProc。這是默認(rèn)的會話狀態(tài)存儲方式,將會話狀態(tài)存儲在本地服務(wù)器上。此時,可以設(shè)置一個計數(shù)器,并編寫頁面重定向的引導(dǎo)程序,在引導(dǎo)程序中根據(jù)計數(shù)器的值去判斷訪問哪個服務(wù)器,在重定向時使用Web服務(wù)器的IP地址而不使用域名去訪問站點(diǎn),這樣一個用戶在會話期間訪問的所有頁面程序都會固定在同一個服務(wù)器上,而不會因并發(fā)量大時出現(xiàn)“交叉”訪問的情況。
以上列出了在實際應(yīng)用開發(fā)中常見的會話狀態(tài)丟失情況及相應(yīng)的解決策略。根據(jù)系統(tǒng)需求和運(yùn)行環(huán)境配置的不同,開發(fā)者可根據(jù)相應(yīng)的策略或者多種策略綜合運(yùn)用來防止會話狀態(tài)意外丟失從而使系統(tǒng)運(yùn)行的更穩(wěn)定。
[1]榮耀,瞿靜文.ASP.ENT 2.0實戰(zhàn)起步[M].北京:機(jī)械工業(yè)出版社,2008.
[2]李彥.ASP.NET3.5系統(tǒng)開發(fā)精髓[M].北京:電子工業(yè)出版社,2009.
[3]科霍斯羅維.ASP.NET&IIS7高級編程[M].北京:清華大學(xué)出版社,2008.
[4]劉乃麗.asp.net2.0 網(wǎng)絡(luò)開發(fā)詳解[M].電子工業(yè)出版社,2008.
[5]蘇貴洋.asp.net網(wǎng)絡(luò)編程從基礎(chǔ)到實踐[M].電子工業(yè)出版社,2005.
Abstract:The session state drops out constantly in developing and using B/S model application system based on ASP.NET.The reasons differ because of the difference of system environment or application configuration.This paper first introduces the session in ASP.NET,then summarizes the drop - out situations and analyzes the reasons,and finally proposes some solutions.
Key words:session state,session timeout,session state drop -out
On the Session State Drop-out in the Application of ASP.NET and its Solutions
CAO Shou-fu
TP3
A
1009-5152(2011)01-0052-02
2010-10-25
曹守富(1981- ),男,湖南廣播電視大學(xué)信息工程系助教。