ASP應(yīng)用程序狀態(tài)管理.ppt
《ASP應(yīng)用程序狀態(tài)管理.ppt》由會(huì)員分享,可在線閱讀,更多相關(guān)《ASP應(yīng)用程序狀態(tài)管理.ppt(18頁珍藏版)》請?jiān)谘b配圖網(wǎng)上搜索。
第6章ASP.NET應(yīng)用程序狀態(tài)管理,如果讀者曾經(jīng)有過開發(fā)Windows應(yīng)用程序的經(jīng)驗(yàn),可能不太會(huì)留意維護(hù)應(yīng)用程序狀態(tài),因?yàn)閼?yīng)用程序本身就在客戶端運(yùn)行,可以直接在內(nèi)存中維護(hù)其應(yīng)用程序狀態(tài)。但是對(duì)于ASP.NET應(yīng)用程序來說,事情不那么簡單了,因?yàn)锳SP.NET應(yīng)用程序在服務(wù)器端運(yùn)行,客戶端使用無狀態(tài)的HTTP協(xié)議對(duì)ASP.NET應(yīng)用程序發(fā)出請求,ASP.NET應(yīng)用程序響應(yīng)用戶請求,向客戶端發(fā)送請求的HTML代碼,服務(wù)器并不會(huì)維護(hù)任何客戶端狀態(tài)??紤]一個(gè)有著成千上萬并發(fā)用戶的服務(wù)器,如果為每個(gè)用戶都維護(hù)狀態(tài)的話會(huì)耗費(fèi)非常多的資源。對(duì)于一個(gè)Web應(yīng)用程序來說,通常需要維護(hù)應(yīng)用程序的狀態(tài)。比如電子商務(wù)網(wǎng)站的購物車,當(dāng)客戶在多個(gè)頁面中選擇商品時(shí),需要為其維護(hù)一個(gè)所選商品的列表。ASP.NET為解決狀態(tài)維護(hù)的問題提供了多種方法,本章將詳細(xì)討論如何使用這些方法為ASP.NET應(yīng)用程序添加狀態(tài)管理功能。,6.1ASP.NET狀態(tài)管理簡介,由于使用無狀態(tài)的HTTP協(xié)議作為Web應(yīng)用程序的通信協(xié)議,當(dāng)客戶端每次請求頁面時(shí),ASP.NET服務(wù)器端都將重新生成一個(gè)網(wǎng)頁的新實(shí)例。這意味著客戶端用戶在瀏覽器中的一些狀態(tài)或者是一些修改都將丟失。比如一個(gè)客戶管理系統(tǒng),用戶在很多文本框中輸入了內(nèi)容,當(dāng)點(diǎn)擊提交按鈕到服務(wù)器后,從服務(wù)器返回的將是一個(gè)全新的網(wǎng)頁,用戶所添加的內(nèi)容將全部丟失。記得在使用ASP的時(shí)候,筆者為了保存每個(gè)文本框控件中的值信息,在數(shù)據(jù)提交前使用了大量的Session變量來保存每個(gè)文本框的值,并在頁面重新生成后將這些會(huì)話變量中的值一一賦給每個(gè)控件。這是一件相當(dāng)費(fèi)時(shí)費(fèi)力的工作,可謂事倍功半。在ASP.NET最初推出以后,讓筆者眼前一亮的是,當(dāng)頁面回發(fā)(Postback)后,控件依然能保存其輸入的值,ASP.NET使用ViewState技術(shù),也稱為視圖狀態(tài)為控件保存了狀態(tài)信息,ASP.NET中提供了如下幾大用于狀態(tài)管理的技術(shù):,6.2ViewState視圖狀態(tài),視圖狀態(tài)可以說是應(yīng)用最為廣泛的一種技術(shù),幾乎每個(gè)ASP.NET服務(wù)器控件都具有EnableViewState屬性,允許控件在頁面回送時(shí)保存其屬性值。開發(fā)人員也可以使用Page.ViewState集合類添加自己的狀態(tài)數(shù)據(jù),可以使用這個(gè)屬性保存簡單的數(shù)據(jù)類型或者是自定義的對(duì)象類型。例如可以使用視圖狀態(tài)保存一個(gè)計(jì)數(shù)器的值,代碼如下:protectedvoidPage_Load(objectsender,EventArgse){ViewState["Counter"]=5;}可以看到ViewState是一個(gè)字典類型的對(duì)象,使用ViewState[key]=value的格式來設(shè)置值,如果在集合中存在指定鍵的值,則進(jìn)行替換,否則將自動(dòng)創(chuàng)建一個(gè)新的鍵值對(duì)。,6.2.1視圖狀態(tài)原理,應(yīng)用程序在運(yùn)行時(shí),ASP.NET引擎會(huì)自動(dòng)在源代碼的尾部嵌入的一個(gè)隱藏域(HiddenField),命名為_VIEWSTATE。_VIEWSTATE以鍵/值對(duì)集合的形式保存頁面中控件的狀態(tài)數(shù)據(jù),_VIEWSTATE將這些值以Base64編碼格式編碼字符串,如下代碼所示:,6.2.2在視圖狀態(tài)中存儲(chǔ)對(duì)象,在ViewState中,可以存儲(chǔ)用戶自定義的對(duì)象數(shù)據(jù),但是必須知道,當(dāng)存儲(chǔ)一個(gè)自定義對(duì)象時(shí),ASP.NET必須能夠轉(zhuǎn)換該對(duì)象為字節(jié)流以便于將對(duì)象添加到頁面隱藏域中進(jìn)行保存。這意味著自定義對(duì)象必須支持序列化,否則ASP.NET將會(huì)拋出異常。下面創(chuàng)建一個(gè)名為ViewStateSample的ASP.NETWeb站點(diǎn),右擊網(wǎng)站項(xiàng)目名稱,選擇“添加新項(xiàng)”菜單項(xiàng),添加一個(gè)新的類,命名為Book.cs,如圖所示:,6.2.3視圖狀態(tài)的安全,ViewState中的數(shù)據(jù)以Base64編碼的格式保存在客戶端瀏覽器中,目前,可以使用很多工具解碼Base64編碼的字符串,例如可以使用一款名為ViewStateDecoder的工具來直接查看視圖狀態(tài)的數(shù)據(jù)結(jié)構(gòu),如圖所示。,6.3跨頁傳遞信息,使用視圖狀態(tài)有一個(gè)很大的限制就是不能跨頁傳遞信息,如果用戶導(dǎo)航到其他頁面,那信息將會(huì)被丟失。本節(jié)將討論如何在多個(gè)頁面之間傳遞信息,可以使用查詢字符串或者是跨頁提交技術(shù)。如果這些技術(shù)都不能滿足應(yīng)用程序的要求,那么可以考慮使用cookies、會(huì)話狀態(tài)或者是應(yīng)用程狀態(tài),本章以后將會(huì)詳細(xì)的討論。,6.3.1查詢字符串,最常用的方法應(yīng)該是在URL中使用查詢字符串來傳遞信息,現(xiàn)今網(wǎng)絡(luò)上多如牛毛的網(wǎng)站都使用這種技術(shù)來在頁面之間傳遞信息。例如如果從每一個(gè)頁面上獲取了當(dāng)前用戶的用戶ID,希望在第二個(gè)頁面上顯示關(guān)于此ID的詳細(xì)信息,可以使用如下的查詢字符串:,6.3.2跨頁回送技術(shù),Postback技術(shù)能夠?qū)㈨撁姘l(fā)送到服務(wù)器并從服務(wù)器重新獲取當(dāng)前的頁面,這個(gè)技術(shù)為在ASP.NET中實(shí)現(xiàn)類似Windows桌面應(yīng)用程序的響應(yīng)效果提供了重大的作用。跨頁回送是postback技術(shù)的擴(kuò)展,使PostBack能夠跨越多個(gè)頁面。ASP.NET的中大多數(shù)按鈕控件都提供了一個(gè)名為PostBackUrl的屬性,該屬性定義在IButtonControl接口中,任何實(shí)現(xiàn)了該接口的控件比如ImageButton、LinkButton和Button控件都具有這個(gè)屬性用來實(shí)現(xiàn)控頁回送。只要為按鈕控件的PostBackUrl指定另一個(gè)Web頁面的Url,當(dāng)用戶點(diǎn)擊按鈕時(shí),頁面將被回送到新的Url頁面,回送的頁面中將包括原來頁面中所有的輸入控件的值。,6.4使用Cookie保存會(huì)話信息,當(dāng)筆者第一次聽到瀏覽器Cookie這個(gè)詞時(shí),對(duì)這個(gè)詞充滿了好感,Cookie中文稱為小甜餅,總讓人想象一些美好的東西。但是后來幾年,這個(gè)技術(shù)被一些沖滿惡意的用戶利用來收集用戶敏感信息,造成了網(wǎng)民們對(duì)這個(gè)技術(shù)是又愛又恨。越來越多的用戶開始在瀏覽器中禁用Cookie,防止敏感信息被黑客盜取。,6.4.1Cookie技術(shù)簡介,Cookie提供了一種在Web應(yīng)用程序中存儲(chǔ)用戶特定信息(如歷史記錄或用戶首選項(xiàng))的方法。Cookie是一小段文本信息,隨著請求和響應(yīng)在Web服務(wù)器和客戶端之間傳遞。Cookie包含每次用戶訪問站點(diǎn)時(shí)Web應(yīng)用程序都可以讀取的信息,這種技術(shù)將在客戶端硬盤上創(chuàng)建一些文件來存放用戶信息,這些文件一般存儲(chǔ)在Internet臨時(shí)文件夾中,圖6.6是筆者的機(jī)器上的Cookie文件。由于Cookie信息是保存在客戶端的文件中,只要用戶沒有清除瀏覽器端的Cookie文件,當(dāng)以后再次請求站點(diǎn)中的頁面時(shí),瀏覽器便會(huì)在本地硬盤上查找與該Url關(guān)聯(lián)的Cookie,如果Cookie存在,會(huì)將該請求與Cookie一起發(fā)送到站點(diǎn)。Cookie文件中保存的是文本信息,而且具有4096個(gè)字節(jié)的限制,很容易被不懷好意的用戶進(jìn)行截取而造成資源的外泄。因此在開發(fā)應(yīng)用程序時(shí),對(duì)于一些機(jī)密性強(qiáng)的信息,比如銀行卡賬號(hào)等,不要使用Cookie技術(shù)來保存。,6.4.2使用Cookie保存信息,ASP.NET中可以使用Response對(duì)象向?yàn)g覽器發(fā)送Cookie,Request對(duì)象獲取Cookie,這兩個(gè)對(duì)象都具有一個(gè)名為Cookies的集合屬性,該集合以名/值對(duì)的形式保存Cookie信息。每個(gè)Cookie必須具有一個(gè)唯一的名稱,以便于瀏覽器進(jìn)行識(shí)別,如果瀏覽器檢測到具有相同名稱的Cookie,則會(huì)覆蓋其中的的一個(gè)。,6.5會(huì)話狀態(tài),會(huì)話狀態(tài)是ASP.NET中非常重要的狀態(tài)管理技術(shù),同時(shí)也是功能很強(qiáng)大的狀態(tài)管理技術(shù)。會(huì)話狀態(tài)允許信息存儲(chǔ)在一個(gè)頁面被能被其他頁面進(jìn)行訪問。會(huì)話狀態(tài)支持標(biāo)準(zhǔn)數(shù)據(jù)類型和任何派生自object的類型,比如用戶自定義的類型。會(huì)話狀態(tài)使用與ViewState類似的集合語法,不同點(diǎn)之處只在于其名稱上,會(huì)話狀態(tài)使用Session,而視圖狀態(tài)使用ViewState。會(huì)話狀態(tài)是特定于用戶的,當(dāng)一個(gè)用戶開始訪問Web應(yīng)用程序時(shí),將會(huì)產(chǎn)生一個(gè)會(huì)話狀態(tài)。不同的用戶具有不同的會(huì)話狀態(tài),如果有1萬個(gè)用戶,將會(huì)有1萬個(gè)用戶狀態(tài)。會(huì)話狀態(tài)在存儲(chǔ)與用戶相關(guān)的信息方面非常有用,比如購特網(wǎng)站的購物車就可以使用會(huì)話狀態(tài)來進(jìn)行存儲(chǔ)。必須注意的是使用會(huì)話狀態(tài)并不是無償?shù)模瑫?huì)話狀態(tài)需要維護(hù)每個(gè)用戶的信息,這將需要消耗大量的服務(wù)器端資源。,6.5.1會(huì)話狀態(tài)簡介,由于必須為每個(gè)用戶維護(hù)一個(gè)會(huì)話狀態(tài),ASP.NET將會(huì)為每個(gè)新用戶請求創(chuàng)建一個(gè)唯一的會(huì)話ID。這個(gè)會(huì)話ID使用了唯一的120位標(biāo)識(shí)符,ASP.NET使用一種保密的算法來生成這個(gè)值以保證這個(gè)值的唯一性。當(dāng)客戶端持有一個(gè)會(huì)話ID,ASP.NET將搜尋相應(yīng)的會(huì)話,提取用戶在會(huì)話中存儲(chǔ)的對(duì)象,放入一個(gè)指定的集合中讓用戶進(jìn)行訪問。必須注意的是會(huì)話狀態(tài)是保存在服務(wù)器端的,這與前面所講的幾種狀態(tài)維護(hù)類型都不相同,為了保證會(huì)話狀態(tài)的安全性,ASP.NET會(huì)話狀態(tài)將不會(huì)直接保存在客戶端。會(huì)話狀態(tài)可以使用多種方式進(jìn)行存儲(chǔ),ASP.NET提供了一個(gè)名為狀態(tài)提供者的機(jī)制,讓開發(fā)人員可以指定要存儲(chǔ)會(huì)話的類型,比如可以指定存儲(chǔ)到服務(wù)器端內(nèi)存,SQLSERVER,專門的狀態(tài)服務(wù)器等等,可以在web.config配置文件中配置會(huì)話狀態(tài)。,6.5.2使用會(huì)話狀態(tài),為了訪問或者是存取會(huì)話狀態(tài),可以使用Page.Session屬性,這是一個(gè)System.Web.SessionState.HttpSessionState類型的集合對(duì)象,使用的方式與本章前面視圖狀態(tài)的方式相似,例如下面的代碼使用Session屬性存儲(chǔ)一個(gè)DataSet對(duì)象,并從Session中獲取DataSet對(duì)象,代碼如下:Session["myDataSet"]=DataSetObject;DataSetObject=(DataSet)Session["myDataSet"];會(huì)話狀態(tài)對(duì)當(dāng)前用戶來說是全局性的,不論用戶訪問哪個(gè)頁面,都可以獲取存儲(chǔ)在會(huì)話狀態(tài)中的信息。但是必須注意,有如下幾個(gè)選項(xiàng)將會(huì)導(dǎo)致會(huì)話狀態(tài)丟失:用戶關(guān)閉并重新啟動(dòng)了瀏覽器。用戶使用不同的瀏覽器訪問相同的頁面,瀏覽器不同將具有不同的處理會(huì)話的方式,因此也會(huì)導(dǎo)致會(huì)話狀態(tài)的丟失。,6.5.3配置會(huì)話狀態(tài),ASP.NET允許開發(fā)人員在web.config配置當(dāng)前應(yīng)用程序的會(huì)話狀態(tài),可以在這個(gè)文件中配置一些較高級(jí)的會(huì)話狀態(tài)選項(xiàng)。web.config有一個(gè)名為sessionState的配置塊,在該塊中提供了很多與Session相關(guān)的配置選擇,一個(gè)簡單的sessionState配置塊的代碼如下所示:下面來分別對(duì)這些配置節(jié)進(jìn)行詳細(xì)的討論:1.Cookieless使用Cookie保存會(huì)話ID2.Timeout指定應(yīng)用程序會(huì)話超時(shí)時(shí)間3.cookieName用于指定存儲(chǔ)會(huì)話ID的Cookie名稱4.mode用于指定會(huì)話狀態(tài)值的位置,6.6應(yīng)用程序狀態(tài),應(yīng)用程序狀態(tài)是指在整個(gè)應(yīng)用程序范圍內(nèi)可被任何客戶端進(jìn)行訪問的一些全局對(duì)象。應(yīng)用程序狀態(tài)基于System.Web.HttpApplicationState類,可以在任何位置使用Page類內(nèi)置的Application對(duì)象來訪問應(yīng)用程序?qū)ο?。?yīng)用程序狀態(tài)的使用方式與Session基本一致,都支持相同的對(duì)象類型,信息都保存在服務(wù)器上,并且使用一致的基于字典的語法。使用應(yīng)用程序變量的一個(gè)常見的例子是網(wǎng)頁計(jì)數(shù)器,,6.7小結(jié),本章討論了ASP.NET中的狀態(tài)管理技術(shù),首先介紹了ASP.NET引入的視圖狀態(tài),介紹了視圖狀態(tài)的原理,如何在視圖狀態(tài)中存儲(chǔ)自定義對(duì)象以及視圖狀態(tài)的安全性。接下來討論了如何在多個(gè)頁面中傳遞信息,討論了如何使用查詢字符串,如何使用跨頁回送技術(shù)讓頁面回送到其他頁面。6.4節(jié)討論了使用Cookie技術(shù)保存會(huì)話信息,并介紹了會(huì)話狀態(tài)和應(yīng)用程序狀態(tài)這兩種服務(wù)器端的狀態(tài)維護(hù)技術(shù)。,- 1.請仔細(xì)閱讀文檔,確保文檔完整性,對(duì)于不預(yù)覽、不比對(duì)內(nèi)容而直接下載帶來的問題本站不予受理。
- 2.下載的文檔,不會(huì)出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請點(diǎn)此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
9.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計(jì)者僅對(duì)作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- ASP 應(yīng)用程序 狀態(tài) 管理
鏈接地址:http://m.hcyjhs8.com/p-3388649.html