直播中
管理互聯(lián)網(wǎng)網(wǎng)頁(yè)主要有二種不同的方法:客戶(hù)端和服務(wù)器端。
1、客戶(hù)端的狀態(tài)管理:
在客戶(hù)端、服務(wù)器之間的多次請(qǐng)求-應(yīng)答期間,服務(wù)器上不保存信息,信息將被存儲(chǔ)在網(wǎng)頁(yè)或用戶(hù)的計(jì)算機(jī)上。
A、Cookie
cookie是存儲(chǔ)在客戶(hù)端文件系統(tǒng)的文本文件中或客戶(hù)端瀏覽器對(duì)話(huà)的內(nèi)存中的少量數(shù)據(jù),它主要用來(lái)跟蹤數(shù)據(jù)設(shè)置。下面我們舉例說(shuō)明:假設(shè)我們要定制化一個(gè)歡迎互聯(lián)網(wǎng)網(wǎng)頁(yè),當(dāng)用戶(hù)請(qǐng)求缺省的互聯(lián)網(wǎng)網(wǎng)頁(yè)時(shí),應(yīng)用程序會(huì)首先檢查用戶(hù)在此前是否已經(jīng)注冊(cè),我們可以從cookie中獲取用戶(hù)的信息:
[c#]
if (Request.Cookies[“username”]!=null)
lbMessage.text=”Dear “+Request.Cookies[“username”].Value+”, Welcome shopping here!”;
else
lbMessage.text=”Welcome shopping here!”;
如果要存儲(chǔ)用戶(hù)的資料,我們可以使用下面的代碼:
[c#]
Response.Cookies[“username’].Value=username;
這樣,當(dāng)用戶(hù)請(qǐng)求該網(wǎng)頁(yè)時(shí),我們就可以方便地識(shí)別該用戶(hù)。
B、隱藏域
隱藏域不會(huì)顯示在用戶(hù)的瀏覽器中,但我們可以象設(shè)置標(biāo)準(zhǔn)控制的屬性那樣設(shè)置其屬性。當(dāng)一個(gè)網(wǎng)頁(yè)被提交給服務(wù)器時(shí),隱藏域的內(nèi)容和其他控制的值一塊兒被送到HTTP Form集合中。隱藏域可以是任何存儲(chǔ)在網(wǎng)頁(yè)中的與網(wǎng)頁(yè)有關(guān)的信息的存儲(chǔ)庫(kù),隱藏域在其value屬性中存儲(chǔ)一個(gè)變量,而且必須被顯性地添加在網(wǎng)頁(yè)上。
ASP.NET中的HtmlInputHidden控制提供了隱藏域的功能。
[c#]
protected System.Web.UI.HtmlControls.HtmlInputHidden Hidden1;
file://給隱藏域賦值
Hidden1.Value=”this is a test”;
file://獲得一個(gè)隱藏域的值
string str=Hidden1.Value;
需要注意的是,要使用隱藏域,就必須使用HTTP-Post方法提交互聯(lián)網(wǎng)網(wǎng)頁(yè)。盡管其名字是隱藏域,但它的值并不是隱藏的,我們可以通過(guò)“查看源代碼”功能找到它的值。
C、狀態(tài)查看
包括網(wǎng)頁(yè)本身在內(nèi)的Web Forms網(wǎng)頁(yè)上的每個(gè)控制都有一個(gè)名字為ViewState的屬性,它是一個(gè)自動(dòng)保持網(wǎng)頁(yè)和控制狀態(tài)的內(nèi)置結(jié)構(gòu),這意味著在向服務(wù)器提交網(wǎng)頁(yè)后,我們無(wú)需采取任何措施來(lái)恢復(fù)控制的數(shù)據(jù)。
在這里,對(duì)我們有用的是ViewState屬性,我們可以利用它來(lái)保存與服務(wù)器之間多次的請(qǐng)求-應(yīng)答期間的信息。
[c#]
file://保存信息
ViewState.Add(“shape”,”circle”);
file://獲取信息
string shapes=ViewState[“shape”];
注意:與隱藏域不同的是,在使用查看源代碼功能時(shí),ViewState屬性的值是不可見(jiàn)的,它們是被壓縮和加密的。
D、查詢(xún)字符串
查詢(xún)字符串提供了一種簡(jiǎn)單而受限制的維護(hù)狀態(tài)信息的方法,我們可以方便地將信息從一個(gè)網(wǎng)頁(yè)傳遞給另一個(gè)網(wǎng)頁(yè),但大多數(shù)瀏覽器和客戶(hù)端裝置都把URL的長(zhǎng)度限制在255個(gè)字符長(zhǎng)。此外,查詢(xún)值是通過(guò)URL傳遞給互聯(lián)網(wǎng)的,因此,在有些情況下,安全就成了一個(gè)大問(wèn)題。
帶有查詢(xún)字符串的URL如下所示:
http://www.examples.com/list.aspx?categoryid=1&productid=101
當(dāng)有客戶(hù)端請(qǐng)求list.aspx后,可以通過(guò)下面的代碼獲取目錄和產(chǎn)品信息:
[c#]
string categoryid, productid;
categoryid=Request.Params[“categoryid”];
productid=Request.Params[“productid”];
注意,我們只能使用HTTP-Get提交該互聯(lián)網(wǎng)網(wǎng)頁(yè),否則就不能從查詢(xún)字符串獲得需要的值。
2、服務(wù)器端的狀態(tài)管理
信息存儲(chǔ)在服務(wù)器上,盡管其安全性較高,但會(huì)占用較多的web服務(wù)器資源。
A、Aplication對(duì)象
Aplication對(duì)象提供了一種讓所有在Web應(yīng)用服務(wù)器中運(yùn)行的代碼訪(fǎng)問(wèn)的存儲(chǔ)數(shù)據(jù)的機(jī)制,插入應(yīng)用程序?qū)ο鬆顟B(tài)變量的數(shù)據(jù)應(yīng)該能夠被多個(gè)對(duì)話(huà)共享,而且不會(huì)頻繁地改變。正是因?yàn)樗軌虮蝗繎?yīng)用程序所訪(fǎng)問(wèn),因此,我們需要使用Lock和UnLock對(duì)避免其中的值出現(xiàn)沖突。
[c#]
Application.Lock();
Application[“mydata”]=”mydata”;
Application.UnLock();
B、Session對(duì)象
Session對(duì)象可以用來(lái)存儲(chǔ)需要在服務(wù)器的多次請(qǐng)求-應(yīng)答期間和對(duì)網(wǎng)頁(yè)的請(qǐng)求期間進(jìn)行維護(hù)的指定對(duì)話(huà)的信息。Session對(duì)象是每個(gè)對(duì)話(huà)的存在的基礎(chǔ),也就是說(shuō)不同的客戶(hù)端生成不同的Session對(duì)象。存儲(chǔ)在對(duì)話(huà)狀態(tài)變量中的數(shù)據(jù)存在的周期較短。
每個(gè)活動(dòng)的ASP.NET對(duì)話(huà)是由一個(gè)包含合法的URL ASCII字符、長(zhǎng)度為120位的SessionID字符串唯一確定和跟蹤的。SessionID的值是由一個(gè)能夠保證唯一性的算法生成的,以便對(duì)話(huà)之間不會(huì)沖突,SessionID的隨意性使得我們很難猜測(cè)出一介現(xiàn)有對(duì)話(huà)的ID。
根據(jù)應(yīng)用程序的配置設(shè)置情況,SessionID通過(guò)HTTP cookie或修改后的URL在客戶(hù)端-服務(wù)器請(qǐng)求之間進(jìn)行傳輸。那么,如何設(shè)置應(yīng)用程序配置的對(duì)話(huà)裝備方法。
每個(gè)web應(yīng)用程序必須有一個(gè)名字為web.config的配置文件,它是基于XML文件的。下面是一個(gè)名字為sessionState的對(duì)話(huà):
cookieless選項(xiàng)的值為true或false。當(dāng)其值為false(缺省值)時(shí),ASP.NET將使用HTTP cookie來(lái)識(shí)別用戶(hù);當(dāng)其值是true時(shí),ASP.NET將隨機(jī)地生成一個(gè)唯一的號(hào)碼,并將它放在被請(qǐng)求的文件的前面,這一號(hào)碼是用來(lái)識(shí)別用戶(hù)的,我們能夠在IE的地址欄中看到它:
http://localhost/Management/(2yzakzez3eqxut45ukyzq3qp)/Default.aspx
OK,下面我們?cè)倩氐絪ession對(duì)象。
[c#]
file://存儲(chǔ)信息
Session[“myname”]=”Mike”;
file://獲得信息
myname=Session[“myname”];
C、數(shù)據(jù)庫(kù)
數(shù)據(jù)庫(kù)將使我們能夠存儲(chǔ)大量的與Web應(yīng)用程序中的狀態(tài)相關(guān)的信息,有時(shí),用戶(hù)會(huì)使用唯一的ID頻繁地訪(fǎng)問(wèn)數(shù)據(jù)庫(kù),我們可以將它存儲(chǔ)在數(shù)據(jù)庫(kù)中,在對(duì)網(wǎng)站中網(wǎng)頁(yè)的多次請(qǐng)求中使用。
總結(jié)
ASP.NET中的功能和工具比ASP中更多,使我們能夠更有效和高效地管理網(wǎng)頁(yè)的狀態(tài)。具體選擇哪種方法與你的應(yīng)用程序有關(guān),在選擇時(shí)可以考慮下面的問(wèn)題:
·需要存儲(chǔ)多少信息?
·客戶(hù)端接受持久的還是內(nèi)存中的cookie?
·希望在客戶(hù)端還是在服務(wù)器端存儲(chǔ)信?
·要存儲(chǔ)的信息需要保密嗎?
·希望你的網(wǎng)頁(yè)的性能如何?