Session 會話
l 區分用戶端,不區分頁面
l 資料量會隨著用戶端(並發)數量的增多,而增多
l 伺服器端儲存什麼:資料存放區在伺服器端(InProc,StateServer,SqlServer)
l 用戶端儲存什麼:用戶端儲存的是SessionID
l 有到期策略
l 適用場合:與使用者相關的資料,購物車,使用者帳號,
Application狀態
l 全域資料,所有用戶端共用:不區分用戶端,不區分頁面
l 伺服器端儲存什麼:資料存放區在伺服器端(伺服器處理序內)
l 用戶端儲存什麼:用戶端不儲存任何與Application狀態資料
l 可能有多線程並發訪問的問題,需要同步(Lock/Unlock)
l 適用場合:全域性的資料,在Application_Start內初始化,然後在其他頁面中訪問
ViewState檢視狀態
l 區分用戶端,區分頁面
l 伺服器端儲存什麼:資料在伺服器和用戶端(頁面資料)來回穿梭
l 用戶端儲存什麼:資料在伺服器和用戶端(頁面資料)來回穿梭
l 適用場合:單一頁面上的臨時性資料,用於使用者和一個頁面之間的來回互動。
l 安全性比較低
頁面上的執行個體欄位
l 區分用戶端,區分頁面,而且區分前後不同的請求
l 生存期極短,只在伺服器處理頁面的過程中有效
l 適用場合範圍較窄
靜態欄位
l 全域資料,所有用戶端共用:不區分用戶端,不區分頁面
l 伺服器端儲存什麼:資料存放區在伺服器端(伺服器處理序內)
l 用戶端儲存什麼:用戶端不儲存任何static狀態資料
l 可能有多線程並發訪問的問題,同步需要自己編寫代碼(不如Application方便)
l 適用場合:全域性的資料,在任何需要的地方內初始化,然後在其他頁面中訪問
查詢字串 Query String
l 區分用戶端,在兩個相鄰的頁面之間共用(通過地址欄上資料)
l 伺服器端儲存什麼:資料在伺服器和用戶端瀏覽器地址欄中互動
l 用戶端儲存什麼:資料在伺服器和用戶端瀏覽器地址欄中互動
l 適用場合:作為資料查詢的分離關鍵字,支援copy或儲存。喪失安全性; 異構網站系統(JSP, ASP, PHP)與ASP.NET頁面整合
Input
l 區分用戶端,在兩個相鄰的頁面之間共用(通過地址欄上資料)
l 伺服器端儲存什麼:資料從用戶端頁面上post給伺服器
l 用戶端儲存什麼:資料從用戶端頁面上post給伺服器
l 適用場合:異構網站系統(JSP, ASP, PHP)與ASP.NET頁面整合
ASP.NET中的狀態管理(1)
Web表格網頁是基於HTTP的,它們沒有狀態,這意味著它們不知道所有的請求是否來自同一台用戶端電腦,網頁是否受到了破壞,以及是否得到了重新整理,這樣就可能造成資訊的丟失。於是,狀態管理就成了開發互連網應用程式中的一個實實在在的問題。
我們在ASP中能夠通過cookie、查詢字串、應用程式、對話等輕易地解決這些問題。現在到了ASP.NET環境中,我們仍然可以使用這些功能,只是它們的種類更多了,功能也更強大了。
管理互連網網頁主要有二種不同的方法:用戶端和伺服器端。
1、用戶端的狀態管理:
在用戶端、伺服器之間的多次請求-應答期間,伺服器上不儲存資訊,資訊將被儲存在網頁或使用者的電腦上。
A、Cookie
cookie是儲存在用戶端檔案系統的文字檔中或用戶端瀏覽器對話的記憶體中的少量資料,它主要用來跟蹤資料設定。下面我們舉例說明:假設我們要定製化一個歡迎互連網網頁,當使用者請求預設的互連網網頁時,應用程式會首先檢查使用者在此前是否已經註冊,我們可以從cookie中擷取使用者的資訊:
[c#]
if (Request.Cookies[“username”]!=null)
lbMessage.text=”Dear “+Request.Cookies[“username”].Value+”, Welcome shopping here!”;
else
lbMessage.text=”Welcome shopping here!”;
如果要儲存使用者的資料,我們可以使用下面的代碼:
[c#]
Response.Cookies[“username’].Value=username;
這樣,當使用者請求該網頁時,我們就可以方便地識別該使用者。
ASP.NET中的狀態管理(2)
B、隱藏欄位
隱藏欄位不會顯示在使用者的瀏覽器中,但我們可以象設定標準控制的屬性那樣設定其屬性。當一個網頁被提交給伺服器時,隱藏欄位的內容和其他控制的值一塊兒被送到HTTP Form集合中。隱藏欄位可以是任何儲存在網頁中的與網頁有關的資訊的存放庫,隱藏欄位在其value屬性中儲存一個變數,而且必須被顯性地添加在網頁上。
ASP.NET中的HtmlInputHidden控制提供了隱藏欄位的功能。
[c#]
protected System.Web.UI.HtmlControls.HtmlInputHidden Hidden1;
file://給隱藏欄位賦值
Hidden1.Value=”this is a test”;
file://獲得一個隱藏欄位的值
string str=Hidden1.Value;
需要注意的是,要使用隱藏欄位,就必須使用HTTP-Post方法提互動連網網頁。儘管其名字是隱藏欄位,但它的值並不是隱藏的,我們可以通過“查看原始碼”功能找到它的值。
C、狀態查看
包括網頁本身在內的Web Forms網頁上的每個控制都有一個名字為ViewState的屬性,它是一個自動保持網頁和控制狀態的內建結構,這意味著在向伺服器提交網頁後,我們無需採取任何措施來恢複控制的資料。
在這裡,對我們有用的是ViewState屬性,我們可以利用它來儲存與伺服器之間多次的請求-應答期間的資訊。
[c#]
file://儲存資訊
ViewState.Add(“shape”,”circle”);
file://擷取資訊
string shapes=ViewState[“shape”];
注意:與隱藏欄位不同的是,在使用查看原始碼功能時,ViewState屬性的值是不可見的,它們是被壓縮和加密的。
D、查詢字串
查詢字串提供了一種簡單而受限制的維護狀態資訊的方法,我們可以方便地將資訊從一個網頁傳遞給另一個網頁,但大多數瀏覽器和用戶端裝置都把URL的長度限制在255個字元長。此外,查詢值是通過URL傳遞給互連網的,因此,在有些情況下,安全就成了一個大問題。
帶有查詢字串的URL如下所示:
http://www.examples.com/list.aspx?categoryid=1&productid=101
當有用戶端請求list.aspx後,可以通過下面的代碼擷取目錄和產品資訊:
[c#]
string categoryid, productid;
categoryid=Request.Params[“categoryid”];
productid=Request.Params[“productid”];
注意,我們只能使用HTTP-Get提交該互連網網頁,否則就不能從查詢字串獲得需要的值。
ASP.NET中的狀態管理(3)
2、伺服器端的狀態管理
資訊儲存在伺服器上,儘管其安全性較高,但會佔用較多的web伺服器資源。
A、Aplication對象
Aplication對象提供了一種讓所有在Web應用伺服器中啟動並執行代碼訪問的儲存資料的機制,插入應用程式物件狀態變數的資料應該能夠被多個對話共用,而且不會頻繁地改變。正是因為它能夠被全部應用程式所訪問,因此,我們需要使用Lock和UnLock對避免其中的值出現衝突。
[c#]
Application.Lock();
Application[“mydata”]=”mydata”;
Application.UnLock();
B、Session對象
Session對象可以用來儲存需要在伺服器的多次請求-應答期間和對網頁的請求期間進行維護的指定對話的資訊。Session對象是每個對話的存在的基礎,也就是說不同的用戶端產生不同的Session對象。儲存在對話狀態變數中的資料存在的周期較短。
每個活動的ASP.NET對話是由一個包含合法的URL ASCII字元、長度為120位的SessionID字串唯一確定和跟蹤的。SessionID的值是由一個能夠保證唯一性的演算法產生的,以便對話之間不會衝突,SessionID的隨意性使得我們很難猜測出一介現有對話的ID。
根據應用程式的配置設定情況,SessionID通過HTTP cookie或修改後的URL在用戶端-伺服器請求之間進行傳輸。那麼,如何設定應用程式配置的對話裝備方法。
每個web應用程式必須有一個名字為web.config的設定檔,它是基於XML檔案的。下面是一個名字為sessionState的對話:
cookieless選項的值為true或false。當其值為false(預設值)時,ASP.NET將使用HTTP cookie來識別使用者;當其值是true時,ASP.NET將隨機地產生一個唯一的號碼,並將它放在被請求的檔案的前面,這一號碼是用來識別使用者的,我們能夠在IE的地址欄中看到它:
http://localhost/Management/(2yzakzez3eqxut45ukyzq3qp)/Default.aspx
OK,下面我們再回到session對象。
[c#]
file://儲存資訊
Session[“myname”]=”Mike”;
file://獲得資訊
myname=Session[“myname”];
C、資料庫
資料庫將使我們能夠儲存大量的與Web應用程式中的狀態相關的資訊,有時,使用者會使用唯一的ID頻繁地訪問資料庫,我們可以將它儲存在資料庫中,在對網站中網頁的多次請求中使用。
總結
ASP.NET中的功能和工具比ASP中更多,使我們能夠更有效和高效地管理網頁的狀態。具體選擇哪種方法與你的應用程式有關,在選擇時可以考慮下面的問題:
·需要儲存多少資訊?
·用戶端接受持久的還是記憶體中的cookie?
·希望在用戶端還是在伺服器端儲存資訊?
·要儲存的資訊需要保密嗎?
·希望你的網頁的效能如何?