狀態(tài)管理(ViewState、Cookie、Session、Application、Cache) 速成部分: viewstate["****"] & session["***"] 直接賦值及使用,不用聲明。 cookie: 設(shè)置: HttpCookie cookieInstance = new HttpCookie("mycookie"); cookieInstance.Values.Add("name","權(quán)昌軍"); Response.Cooki.Add(Mycookie); 讀取: HttpCookie getCookie = Request.Cookie["mycookie"]; string myName = cookie.Values["name"]; //此時,myName中的值是“權(quán)昌軍”
狀態(tài)類型 ViewState Cookie Session Application Cache ViewState: ViewState包含的狀態(tài)與控件發(fā)送給客戶端時 包含的狀態(tài)相同。 當(dāng)瀏覽器把 窗體發(fā)送 回服務(wù)器時, 控件包含新值,而 ViewState包含初始值。如果ViewState中的初始值 與 控件中的新值有區(qū)別時,調(diào)用相應(yīng)的事件處理程序。 使用ViewState的缺點是,數(shù)據(jù)總是要從服務(wù)器 -> 客戶端,再 客戶端 -> 服務(wù)器。增加了網(wǎng)絡(luò)流量。 關(guān)閉ViewState的方法:
還可以設(shè)置 控件的 EnableViewState屬性。只有沒有配置ViewState的控件才使用頁面配置的值。 還可以把定制的數(shù)據(jù)存儲在ViewState中。為此,可使用索引符 和 Page類的ViewState屬性。 ViewState["mydata"] = "my data"; //將字符串存儲在 ViewState中 讀?。?/p> string mydata = (string)ViewState["mydata"]; //將前面存儲的值讀取出來。 在發(fā)送客戶端的HTML代碼中,整個頁面的ViewState存儲在一個隱藏字段中:
使用隱藏字段的優(yōu)點是,每個瀏覽器都能使用這個特征,用戶不能關(guān)閉它。 Cookie: ViewState只能保存在頁面中。如果狀態(tài)應(yīng)保存在多個不同的頁面中,就應(yīng)使用cookie在客戶端保存狀態(tài)。 cookie在HTTP頭中定義。 使用HttpRespone類可以把cookie發(fā)給客戶端。 Response是Page類的一個屬性,它返回一個HttpResponse類型的對象。 HttpResponse類定義了返回HttpCookieCollection的Cookie屬性。 使用HttpCookieCollection可以向客戶端返回多個cookie。 如何把cookie發(fā)給客戶端: string myval = "myval"; HttpCookie cookie = new HttpCookie("mycookie"); //首先實例化一個HttpCookie對象,并設(shè)置cookie的名稱為“mycookie” cookie.Values.Add("mystate",myval); // 用HttpCookie類的Value屬性可以添加多個cookie值 Response.Cookie.Add(cookie); // 發(fā)送cookie 設(shè)置cookie有效期: cookie可以是臨時的,僅在一個瀏覽器會話中有效,也可以是存儲在客戶端磁盤上。 可以使用HttpCookie對象設(shè)置的Expires屬性。 HttpCookie cookie = new HttpCookie("mycookie"); cookie.Values.Add("mystate","myval"); cookie.Expires = DateTime.Now.AddMonths(3); // 設(shè)置cookie有效期為3個月 Response.Cookies.Add(cookie); 盡管設(shè)置了cookie,但不一定能存儲那么長時間。 用戶可能會刪除cookie; 如果本地有太多的cookie,瀏覽器也可能刪除它。 瀏覽器只能為每個服務(wù)器存儲 20 個cookie;為所有服務(wù)器 存儲 300個cookie; cookie大小有限制,cookie不能存儲多于4K的數(shù)據(jù)。達到極限后,就刪除有一段時間不用的cookie。 讀取客戶端發(fā)送的cookie: 客戶從服務(wù)器請求頁面時,相應(yīng)的cookie就可以使用了。 并作為HTTP請求的一部分發(fā)送給服務(wù)器。 要讀取cookie,可以訪問HttpRequest對象的cookie集合。 與HTTP響應(yīng)一樣,Page類也有一個Request屬性 返回 HttpRequest類型的對象。 Cookies屬性返回HttpCookieCollection,它可以讀取客戶端發(fā)送的cookie。 可以用索引符來訪問cookie,并使用HttpCookie的value屬性從cookie中獲取值。 HttpCookie cookie = Request.Cookies["mycookie"]; string myval = cookie.Values["mystate"]; Session: 會話狀態(tài) 與 瀏覽器會話相關(guān)。 當(dāng)客戶第一次打開ASP.NET頁面時,會話就開始了。當(dāng)客戶20分鐘(session默認(rèn)值)內(nèi)沒有訪問服務(wù)器時,會話結(jié)束。
文件中定義了一些事件處理程序:
void Application_Start(object sender, EventArgs e) {......}
.......
會話狀態(tài)可以存儲在HttpSessionState對象中。 與當(dāng)前HTTP環(huán)境相關(guān)的會話狀態(tài)對象可以使用Page類的Session屬性來訪問。 設(shè)置會話狀態(tài): void Session_Start(Object sender, EventArgs e) { Session["mydata"] = 0; } // 在Session_Start()事件處理程序中,初始化會話變量,mydata會話被初始化為 0 讀取會話狀態(tài): int val = (int)Session["mydata"]; 要把客戶端 與 會話變量 關(guān)聯(lián)起來, ASP.NET默認(rèn)使用一個臨時cookie 和 一個會話標(biāo)識符。 ASP.NET也支持沒有cookie的會話,其中URL標(biāo)示符 用于把 HTTP請求映射到同一個會話。 Application: 如果數(shù)據(jù)要在多個客戶端共享,就可以使用應(yīng)用程序狀態(tài)(Application)。比如,網(wǎng)站訪問計數(shù)器。 應(yīng)用程序狀態(tài)使用HttpApplicationState類,通過Page類的Application屬性訪問。 以網(wǎng)站訪問計數(shù)器為例: 設(shè)置狀態(tài): void Application_start(object sender, EventArgs e) { Application["userCount"] = 0 ; } // Application_Start()是global.asax文件中的事件處理方法,在啟動網(wǎng)站的第一個頁面時啟動。
void Session_Start(Object sender, EventArgs e) { Application.Lock(); // 應(yīng)用程序狀態(tài)改變之前,必須要用Lock()鎖定,因為多個用戶可以同時訪問這個應(yīng)用程序變量。 Application["userCount"] = (int) Application["userCount"] +1; Application.UnLock(); // 鎖定 與 解鎖之間的時間應(yīng)盡量短,否則,其他人就得等解鎖之后才能操作。 } 讀取狀態(tài): label1.Text = Application["userCount"].ToString(); Cache: 類似于Application,可以在多個客戶端上共享。但Cache可以自定義何時失效。我們不是給每個請求讀取文件或數(shù)據(jù)庫,而是把數(shù)據(jù)存儲在高速緩存(Cache)中。 Cache使用System.Web.Caching名稱空間 和 Cache類。 給Cache添加對象: Cache.Add("mycache", myobj, null, DateTime.MaxValue, TimeSpan.FromMinutes(10), CacheItemPriority.Normal, null ); Page類的Cache屬性返回一個Cache對象。使用Cache類的Add()方法可以把任意對象賦予高速緩存。 第一個參數(shù),定義Cache項的名稱; 第二個參數(shù),是要被緩存的對象; 第三個參數(shù),定義了依賴關(guān)系。比如,Cache依賴于一個文件,當(dāng)文件改變時,高速緩存對象就失效,本例中沒有依賴關(guān)系; 第四個參數(shù),定義了Cache失效的絕對時間; 第五個參數(shù),定義了Cache失效的相對時間; 第六個參數(shù),定義了Cache的優(yōu)先級,當(dāng)需要刪除Cache時,會根據(jù)優(yōu)先級刪除。優(yōu)先級低的先刪除。 最后一個參數(shù),定義了一個方法,當(dāng)刪除Cache調(diào)用。當(dāng)Cache依賴于一個文件時,就可以用該參數(shù):文件改變時,刪除Cache,調(diào)用方法,再次讀取文件,重新建立Cache。 讀取Cache: object o = Cache["mycache"]; if(o == null) { //reload the cache } else { //use the cache MyClass myObj = (MyClass)o; } 使用Cache屬性返回的對象之前,必須檢查結(jié)果是否為null,當(dāng)高速緩存失效時,結(jié)果就是null。 |