HTTP是一個無狀態(tài)的協(xié)議似嗤。每次的請求都是獨立的,它的執(zhí)行情況和結果與前面的請求和之后的請求是無直接關系的烹俗,它不會受前面的請求應答情況直接影響降允,也不會直接影響后面的請求應答情況。
而實際上艺糜,我們的系統(tǒng)往往要支持用戶在客戶端瀏覽器和服務端之間的多次請求共用相同的數(shù)據(jù)(狀態(tài))剧董,比如用戶的登陸賬號信息。于是乎破停,ASP.NET提供了很多變量來管理狀態(tài):比如application state翅楼,session state,view state等真慢。
HttpContext對象只針對一個單一的http請求毅臊。這個類的屬性還有Request對象、Response對象黑界、Session對象等管嬉。這里要說的是HttpContext類的Items(屬性) 集合,它包含了key-value形式的哈希表對象朗鸠。
首先蚯撩,我們看HttpContext.Current.Items的用途,它只作用于單獨的一個用戶請求(HttpContext.Current.Items valid for a single HTTPRequest)烛占。完成這個請求胎挎,服務器信息傳回瀏覽器的時候,這個Item集合將丟失忆家。而Session對象是針對用戶的本次會話犹菇,也就是作用 于多個用戶請求,在Session失效后才丟失其中的信息芽卿。
既然HttpContext.Current.Items的生命周期如此之短揭芍,那在什么情況下可以加以利用呢。這里指出蹬竖,HttpContext.Current.Items 可以在 HttpModule 和 HTTPHandler 之間共享數(shù)據(jù)時使用沼沈,因為每次用戶請求都要通過HTTP 運行時管道HttpModule 、HTTPHandler 币厕。當你實現(xiàn)IHttpMoudle的方法來通過HttpMoudle向用戶請求傳遞信息闹伪。你可以用HttpContext.Current.Items 在不同請求頁,不同的HttpModule中傳輸數(shù)據(jù)态兴,但是一旦請求結束蓄氧,數(shù)據(jù)回發(fā),這個集合中的數(shù)據(jù)將自己丟失。如下圖所示:
另外店乐,當服務端頁面跳轉(Server.Execute/Server.Transfer)時艰躺,我們可以使用HttpContext.Current.Items在兩個表單之間傳遞數(shù)據(jù)。
/*** WebForm1: ***/
private void Page_Load(object sender, System.EventArgs e)
{
ArrayList list = new ArrayList(4);
list.Add("This list ");
list.Add("is for ");
list.Add("WebForm2 ");
list.Add("to see. ");
Context.Items["WebForm1List"] = list;
Server.Transfer("WebForm2.aspx");
}
/*** 對于WebForm2: ***/
private void Page_Load(object sender, System.EventArgs e)
{
ArrayList list = Context.Items["WebForm1List"] as ArrayList;
foreach(string s in list)
{
Response.Write(s);
}
}
很顯然眨八,如果把Server.Transfer改為Response.Redirect的時候腺兴,由于是不同的Http請求,在新的頁面里是無法獲取到HttpContext.Current.Items里的數(shù)據(jù)的廉侧。這時會報System.NullReferenceException: 未將對象引用設置到對象的實例页响。