掃描二維碼關注

首頁 APP開(kāi)發小(xiǎo)程序開(kāi)發 微信公衆号 網站建設 營銷推廣 經典案列 産品服務 關于我們

“學習(xí)不僅是掌握知識”

向書(shū)本學習(xí),還要向實踐學習(xí)、向生活學習(xí)。消化已有(yǒu)知識,
而且要力求有(yǒu)所發現、有(yǒu)所發明(míng)、有(yǒu)所創造

ASP.NET 的(de)狀态管理(lǐ)

2019/3/14 8:48:36

ASP.NET 的(de)狀态管理(lǐ)

 web Form 網頁是基于HTTP的(de),它們沒有(yǒu)狀态, 這意味著(zhe)它們不知道所有(yǒu)的(de)請求是否來自同一台客戶端計(jì)算機,網頁是受到(dào)了破壞,以及是否得到(dào)了刷新,這樣就可(kě)能(néng)造成信息的(de)丢失。 于是, 狀态管理(lǐ)就成了開(kāi)發網絡應用(yòng)程序的(de)一個(gè)實實在在的(de)問題。
    在ASP中能(néng)夠通過Cookie 、查詢字符串、 應用(yòng)程序、會(huì)話(huà)(Session) 等輕易解決這些問題。現在在ASP.NET環境中,我們依然可(kě)以使用(yòng)這些功能(néng),并且功能(néng)更加強大(dà)。
  狀态管理(lǐ)分(fēn)爲服務端和(hé)客戶端兩種情況, 這裏隻是介紹 服務端狀态管理(lǐ):

   與Application對象不同的(de)是, ASP.NET 的(de)Session對象可(kě)以在IIS服務器(qì)或者工(gōng)作進程重新啓動時恢複啓動前的(de)狀态而不丢失其中的(de)數據。這是因爲存儲在Session中的(de)所以信息都(dōu)缺省的(de)存儲在一個(gè)作爲Windows服務運行(xíng)的(de)狀态服務器(qì)進程中。狀态可(kě)以被序列化并以二進制(zhì)形式保存在内存中。
程序員可(kě)以懸著(zhe)使用(yòng)Microsoft Sql server數據庫來存儲數據。

狀态服務器(qì)服務和(hé)狀态信息可(kě)以和(hé)web應用(yòng)程序一起存在于同一台服務器(qì)上(shàng),也(yě)可(kě)以保存到(dào)外部的(de)狀态服務器(qì)上(shàng)。 爲了指定如(rú)何存儲信息,程序員可(kě)以在web.config文(wén)件(jiàn)中編寫适當的(de)配置。

  ASP.NET會(huì)話(huà)狀态模塊在Web.config文(wén)件(jiàn)中<System.web>标記下的(de)<Sessionstate>标記的(de)mode屬性來決定該屬性的(de)四種可(kě)能(néng)的(de)值: Off、 Inproc StateServer 和(hé)SQLserver。
  
1  Inproc是缺省的(de)設置
 
它允許“無Cookie”的(de)會(huì)話(huà),以及在服務器(qì)之外存儲會(huì)話(huà)數據。ASP.NET會(huì)話(huà)狀态模塊在Web.config文(wén)件(jiàn)中像下面這樣配置:

<sessionState mode="InProc" cookieless="false" timeout="20" />

在這個(gè)例子中,mode屬性設爲InProc(默認值),表明(míng)會(huì)話(huà)狀态要由ASP.NET存儲到(dào)内存中,而且不用(yòng)Cookie來傳遞會(huì)話(huà)ID。相(xiàng)反,會(huì)話(huà)ID要直接插入一個(gè)網頁URL的(de)查詢字符串中。例如(rú),采用(yòng)InProc模式并建立一個(gè)會(huì)話(huà)之後,調用(yòng)一個(gè)假想的(de)ASP.NET網頁時,需要采用(yòng)下面這樣的(de)URL:

http://my.hichina.com/(12mfju55vgblubjlwsi4dgjq)/education.aspx

圓括号中長長的(de)字母、數字字符串就是會(huì)話(huà)ID。ASP.NET引擎從查詢字符中提取會(huì)話(huà)ID,并将用(yòng)戶請求與特定會(huì)話(huà)聯系起來。采取這種方式,不管Cookie還是隐藏表單字段都(dōu)用(yòng)不著(zhe)了。所以,即使網頁中沒有(yǒu)使用(yòng)表單,也(yě)能(néng)加入會(huì)話(huà)。

  但(dàn)是這種方法,應用(yòng)程序的(de)狀态将依賴于 ASP.NET進程, 當IIS進程崩潰或者正常重啓時,保存在進程中的(de)狀态将丢失。


2 mode屬性設爲Off
 
   和(hé)從前的(de)ASP一樣,ASP.NET的(de)會(huì)話(huà)狀态管理(lǐ)是要産生開(kāi)銷的(de)。所以,假如(rú)某個(gè)網頁不需要訪問Session對象,開(kāi)發者應将那個(gè)頁的(de)Page預編譯指令的(de)EnableSessionState屬性設爲False。要爲整個(gè)網站禁用(yòng)會(huì)話(huà)狀态,可(kě)在Web.config文(wén)件(jiàn)中将sessionState元素的(de)mode屬性設爲Off。

   爲了克服inproc 模式的(de)缺點, ASP.NET 提供了兩種進程外保存會(huì)話(huà)狀态的(de)方法。

3 StateServer會(huì)話(huà)管理(lǐ)

  将mode屬性設爲StateServer,也(yě)就是将會(huì)話(huà)數據存儲到(dào)單獨的(de)内存緩沖區中,再由單獨一台機器(qì)上(shàng)運行(xíng)的(de)Windows服務來控制(zhì)這個(gè)緩沖區。狀态服務全稱是“ASP.NET State Service ”(aspnet_state.exe),它由Web.config文(wén)件(jiàn)中的(de)stateConnectionString屬性來配置。該屬性指定了服務所在的(de)服務器(qì),以及要監視的(de)端口:
<sessionState mode="StateServer"
    stateConnectionString="tcpip=myserver:42424"
    cookieless="false" timeout="20" />
  
在這個(gè)例子中,狀态服務在一台名爲myserver的(de)機器(qì)的(de)42424端口(默認端口)運行(xíng)。要在服務器(qì)上(shàng)改變端口,可(kě)編輯HKLM\SYSTEM\CurrentControlSet\Services\aspnet_state注冊表項中的(de)Port值。

顯然,使用(yòng)狀态服務的(de)優點在于進程隔離(lí),并可(kě)在Web farm中共享。 使用(yòng)這種模式,會(huì)話(huà)狀态的(de)存儲将不依賴于iis進程的(de)失敗或者重啓,然而,一旦狀态服務中止,所有(yǒu)會(huì)話(huà)數據都(dōu)會(huì)丢失。換言之,狀态服務不像SQL Server那樣能(néng)持久存儲數據;它隻是将數據存儲在内存中。

4  用(yòng)SQL Server進行(xíng)會(huì)話(huà)管理(lǐ)

 ASP.NET還允許将會(huì)話(huà)數據存儲到(dào)一個(gè)數據庫服務器(qì)中,方法是将mode屬性變成SqlServer。在這種情況下,ASP.NET嘗試将會(huì)話(huà)數據存儲到(dào)由sqlConnectionString屬性(其中包含數據源以及登錄服務器(qì)所需的(de)安全憑證)指定的(de)SQL Server中。
爲了用(yòng)恰當的(de)數據庫對象來配置SQL server,管理(lǐ)員還需要創建ASPState數


深圳市南山區南山街(jiē)道南海(hǎi)大(dà)道西(xī)桂廟路(lù)北陽光(guāng)華藝大(dà)廈1棟4F、4G-04

咨詢電話(huà):136 8237 6272
大(dà)客戶咨詢:139 0290 5075
業(yè)務QQ:195006118
技術(shù)QQ:179981967

更多可(kě)以了解的(de)信息

客戶案列
新聞資訊
資質榮譽
團隊風采
項目進度查詢

售前QQ咨詢
QQ溝通 項目QQ溝通

精銳軟件(jiàn)

Copyright© 2018-2023 深圳市無窮大軟件技術有限公司 All Rights Reserved. 京ICP證000000号 公安備案号:粵公網安備44030502009460号