向書本學(xué)習(xí),還要向?qū)嵺`學(xué)習(xí)、向生活學(xué)習(xí)。消化已有知識,
而且要力求有所發(fā)現(xiàn)、有所發(fā)明、有所創(chuàng)造
2019/3/14 8:48:36
web Form 網(wǎng)頁是基于HTTP的,它們沒有狀態(tài), 這意味著它們不知道所有的請求是否來自同一臺客戶端計算機,網(wǎng)頁是受到了破壞,以及是否得到了刷新,這樣就可能造成信息的丟失。 于是, 狀態(tài)管理就成了開發(fā)網(wǎng)絡(luò)應(yīng)用程序的一個實實在在的問題。
在ASP中能夠通過Cookie 、查詢字符串、 應(yīng)用程序、會話(Session) 等輕易解決這些問題?,F(xiàn)在在ASP.NET環(huán)境中,我們依然可以使用這些功能,并且功能更加強大。
狀態(tài)管理分為服務(wù)端和客戶端兩種情況, 這里只是介紹 服務(wù)端狀態(tài)管理:
與Application對象不同的是, ASP.NET 的Session對象可以在IIS服務(wù)器或者工作進程重新啟動時恢復(fù)啟動前的狀態(tài)而不丟失其中的數(shù)據(jù)。這是因為存儲在Session中的所以信息都缺省的存儲在一個作為Windows服務(wù)運行的狀態(tài)服務(wù)器進程中。狀態(tài)可以被序列化并以二進制形式保存在內(nèi)存中。
程序員可以懸著使用Microsoft Sql server數(shù)據(jù)庫來存儲數(shù)據(jù)。
狀態(tài)服務(wù)器服務(wù)和狀態(tài)信息可以和web應(yīng)用程序一起存在于同一臺服務(wù)器上,也可以保存到外部的狀態(tài)服務(wù)器上。 為了指定如何存儲信息,程序員可以在web.config文件中編寫適當?shù)呐渲谩?/p>
ASP.NET會話狀態(tài)模塊在Web.config文件中<System.web>標記下的<Sessionstate>標記的mode屬性來決定該屬性的四種可能的值: Off、 Inproc StateServer 和SQLserver。
1 Inproc是缺省的設(shè)置
它允許“無Cookie”的會話,以及在服務(wù)器之外存儲會話數(shù)據(jù)。ASP.NET會話狀態(tài)模塊在Web.config文件中像下面這樣配置:
<sessionState mode="InProc" cookieless="false" timeout="20" />
在這個例子中,mode屬性設(shè)為InProc(默認值),表明會話狀態(tài)要由ASP.NET存儲到內(nèi)存中,而且不用Cookie來傳遞會話ID。相反,會話ID要直接插入一個網(wǎng)頁URL的查詢字符串中。例如,采用InProc模式并建立一個會話之后,調(diào)用一個假想的ASP.NET網(wǎng)頁時,需要采用下面這樣的URL:
http://my.hichina.com/(12mfju55vgblubjlwsi4dgjq)/education.aspx
圓括號中長長的字母、數(shù)字字符串就是會話ID。ASP.NET引擎從查詢字符中提取會話ID,并將用戶請求與特定會話聯(lián)系起來。采取這種方式,不管Cookie還是隱藏表單字段都用不著了。所以,即使網(wǎng)頁中沒有使用表單,也能加入會話。
但是這種方法,應(yīng)用程序的狀態(tài)將依賴于 ASP.NET進程, 當IIS進程崩潰或者正常重啟時,保存在進程中的狀態(tài)將丟失。
2 mode屬性設(shè)為Off
和從前的ASP一樣,ASP.NET的會話狀態(tài)管理是要產(chǎn)生開銷的。所以,假如某個網(wǎng)頁不需要訪問Session對象,開發(fā)者應(yīng)將那個頁的Page預(yù)編譯指令的EnableSessionState屬性設(shè)為False。要為整個網(wǎng)站禁用會話狀態(tài),可在Web.config文件中將sessionState元素的mode屬性設(shè)為Off。
為了克服inproc 模式的缺點, ASP.NET 提供了兩種進程外保存會話狀態(tài)的方法。
3 StateServer會話管理
將mode屬性設(shè)為StateServer,也就是將會話數(shù)據(jù)存儲到單獨的內(nèi)存緩沖區(qū)中,再由單獨一臺機器上運行的Windows服務(wù)來控制這個緩沖區(qū)。狀態(tài)服務(wù)全稱是“ASP.NET State Service ”(aspnet_state.exe),它由Web.config文件中的stateConnectionString屬性來配置。該屬性指定了服務(wù)所在的服務(wù)器,以及要監(jiān)視的端口:
<sessionState mode="StateServer"
stateConnectionString="tcpip=myserver:42424"
cookieless="false" timeout="20" />
在這個例子中,狀態(tài)服務(wù)在一臺名為myserver的機器的42424端口(默認端口)運行。要在服務(wù)器上改變端口,可編輯HKLM\SYSTEM\CurrentControlSet\Services\aspnet_state注冊表項中的Port值。
顯然,使用狀態(tài)服務(wù)的優(yōu)點在于進程隔離,并可在Web farm中共享。 使用這種模式,會話狀態(tài)的存儲將不依賴于iis進程的失敗或者重啟,然而,一旦狀態(tài)服務(wù)中止,所有會話數(shù)據(jù)都會丟失。換言之,狀態(tài)服務(wù)不像SQL Server那樣能持久存儲數(shù)據(jù);它只是將數(shù)據(jù)存儲在內(nèi)存中。
4 用SQL Server進行會話管理
ASP.NET還允許將會話數(shù)據(jù)存儲到一個數(shù)據(jù)庫服務(wù)器中,方法是將mode屬性變成SqlServer。在這種情況下,ASP.NET嘗試將會話數(shù)據(jù)存儲到由sqlConnectionString屬性(其中包含數(shù)據(jù)源以及登錄服務(wù)器所需的安全憑證)指定的SQL Server中。
為了用恰當?shù)臄?shù)據(jù)庫對象來配置SQL server,管理員還需要創(chuàng)建ASPState數(shù)
深圳市南山區(qū)南山街道南海大道西桂廟路北陽光華藝大廈1棟4F、4G-04
咨詢電話:136 8237 6272
大客戶咨詢:139 0290 5075
業(yè)務(wù)QQ:195006118
技術(shù)QQ:179981967