在ASP.NET中,有很多種保存信息的對(duì)象.例如:APPlication,Session,Cookie,ViewState和Cache等,那么它們有什么區(qū)別呢?每一種對(duì)象應(yīng)用的環(huán)境是什么?
為了更清楚的了解,我們總結(jié)出每一種對(duì)象應(yīng)用的具體環(huán)境,如下表所示:
方法 |
信息量大小 |
保存時(shí)間 |
應(yīng)用范圍 |
保存位置 |
Application |
任意大小 |
整個(gè)應(yīng)用程序的生命期 |
所有用戶(hù) |
服務(wù)器端 |
Session |
小量,簡(jiǎn)單的數(shù)據(jù) |
用戶(hù)活動(dòng)時(shí)間+一段延遲時(shí)間(一般 為20分鐘)
|
單個(gè)用戶(hù) |
服務(wù)器端 |
Cookie |
小量,簡(jiǎn)單的數(shù)據(jù) |
可以根據(jù)需要設(shè)定 |
單個(gè)用戶(hù) |
客戶(hù)端 |
Viewstate |
小量,簡(jiǎn)單的數(shù)據(jù) |
一個(gè)Web頁(yè)面的生命期 |
單個(gè)用戶(hù) |
客戶(hù)端 |
Cache |
任意大小 |
可以根據(jù)需要設(shè)定 |
所有用戶(hù) |
服務(wù)器端 |
隱藏域 |
小量,簡(jiǎn)單的數(shù)據(jù) |
一個(gè)Web頁(yè)面的生命期 |
單個(gè)用戶(hù) |
客戶(hù)端 |
查詢(xún)字符串 |
小量,簡(jiǎn)單的數(shù)據(jù) |
直到下次頁(yè)面跳轉(zhuǎn)請(qǐng)求 |
單個(gè)用戶(hù) |
客戶(hù)端 |
Web.Config文件 |
不變或極少改變的小量數(shù)據(jù) |
直到配置文件被更新 |
單個(gè)用戶(hù) |
服務(wù)器端 |
1.Application對(duì)象
Application用于保存所有用戶(hù)的公共的數(shù)據(jù)信息,如果使用Application對(duì)象,一個(gè)需要考慮的問(wèn)題是任何寫(xiě)操作都要在Application_OnStart事件(global.asax)中完成.盡管使用Application.Lock和Applicaiton.Unlock方法來(lái)避免寫(xiě)操作的同步,但是它串行化了對(duì)Application對(duì)象的請(qǐng)求,當(dāng)網(wǎng)站訪問(wèn)量大的時(shí)候會(huì)產(chǎn)生嚴(yán)重的性能瓶頸.因此最好不要用此對(duì)象保存大的數(shù)據(jù)集合. 下面我們做個(gè)在線用戶(hù)統(tǒng)計(jì)的例子來(lái)說(shuō)明這個(gè)問(wèn)題:
(以文件的形式存放網(wǎng)站總訪問(wèn)量)
(1)Global.asax類(lèi)
using System;
using System.Collections;
using System.ComponentModel;
using System.Web;
using System.Web.SessionState;
using System.IO;

namespace WebAppCounter


{

/**////
/// Global 的摘要說(shuō)明。
///
public class Global : System.Web.HttpApplication

{

/**////
/// 必需的設(shè)計(jì)器變量。
///
private System.ComponentModel.IContainer components = null;

private FileStream fileStream;
private StreamReader reader;//讀字符流
private StreamWriter writer;//寫(xiě)字符流
public Global()

{
InitializeComponent();
}

protected void Application_Start(Object sender, EventArgs e)

{
Application["CurrentGuests"]=0;//初始花為0;
fileStream = File.Open(Server.MapPath("counts.text"),FileMode.OpenOrCreate);//文件不存在,創(chuàng)建文件
reader = new StreamReader(fileStream);//要讀取的完整路徑
Application["AllGuests"] = Convert.ToInt32(reader.ReadLine()); //從當(dāng)前流中讀取一行字符并將數(shù)據(jù)作為字符串返回
reader.Close();//關(guān)閉流
}
protected void Session_Start(Object sender, EventArgs e)//當(dāng)用戶(hù)訪問(wèn)網(wǎng)站時(shí),在線用戶(hù)+1,總訪問(wèn)數(shù)+1

{
Application.Lock();//同步,避免同時(shí)寫(xiě)入
Application["CurrentGuests"] =(int)Application["CurrentGuests"]+ 1;//總在線用戶(hù)數(shù)
Application["AllGuests"] =(int)Application["AllGuests"]+ 1;//訪問(wèn)網(wǎng)站的總用戶(hù)數(shù)
fileStream = new FileStream(Server.MapPath("counts.text"),FileMode.OpenOrCreate,FileAccess.ReadWrite);//
writer = new StreamWriter(fileStream);//實(shí)現(xiàn)一個(gè)寫(xiě)入流,使其以一種特定的編碼向流中寫(xiě)入字符
writer.WriteLine(Application["AllGuests"].ToString());//把訪問(wèn)網(wǎng)站的總用戶(hù)數(shù)再次寫(xiě)入到文件
writer.Close();//關(guān)閉寫(xiě)入流

Application.UnLock();//同步結(jié)束
}

protected void Application_BeginRequest(Object sender, EventArgs e)

{
}

protected void Application_EndRequest(Object sender, EventArgs e)

{
}

protected void Application_AuthenticateRequest(Object sender, EventArgs e)

{

}

protected void Application_Error(Object sender, EventArgs e)

{

}

protected void Session_End(Object sender, EventArgs e)//當(dāng)前用戶(hù)退出網(wǎng)站時(shí),在線用戶(hù)數(shù)量-1,

{
Application.Lock();
Application["CurrentGuests"] =(int)Application["CurrentGuests"] - 1;//總在線用戶(hù)數(shù)量-1
Application.UnLock();

}

protected void Application_End(Object sender, EventArgs e)

{

}

Web 窗體設(shè)計(jì)器生成的代碼#region Web 窗體設(shè)計(jì)器生成的代碼

/**////
/// 設(shè)計(jì)器支持所需的方法 - 不要使用代碼編輯器修改
/// 此方法的內(nèi)容。
///
private void InitializeComponent()

{
this.components = new System.ComponentModel.Container();
}
#endregion
}
}

(2) WebForm1.aspx
private void Page_Load(object sender, System.EventArgs e)

{
this.Label1.Text = "正在訪問(wèn)站點(diǎn)的用戶(hù)數(shù):" + Application["CurrentGuests"].ToString();
this.Label2.Text ="訪問(wèn)過(guò)站點(diǎn)的總用戶(hù)數(shù):" + Application["AllGuests"].ToString();
}

2.Session對(duì)象
Session用于保存每個(gè)用戶(hù)的專(zhuān)用信息.她的生存期是用戶(hù)持續(xù)請(qǐng)求時(shí)間再加上一段時(shí)間(一般是20分鐘左右).S
ession中的信息保存在Web服務(wù)器內(nèi)容中,保存的數(shù)據(jù)量可大可小.當(dāng)Session超時(shí)或被關(guān)閉時(shí)將自動(dòng)釋放保存的數(shù)據(jù)信息.由于用戶(hù)停止使用應(yīng)用程序后它仍然在內(nèi)存中保持一段時(shí)間,因此使用Session對(duì)象使保存用戶(hù)數(shù)據(jù)的方法效率很低.對(duì)于小量的數(shù)據(jù),使用Session對(duì)象保存還是一個(gè)不錯(cuò)的選擇.使用Session對(duì)象保存信息的代碼如下:
//存放信息
Session["username"]="zhouhuan";
//讀取數(shù)據(jù)
string UserName=Session["username"].ToString();
3.Cookie對(duì)象
Cookie用于保存客戶(hù)瀏覽器請(qǐng)求服務(wù)器頁(yè)面的請(qǐng)求信息,程序員也可以用它存放非敏感性的用戶(hù)信息,信息保存的時(shí)間可以根據(jù)需要設(shè)置.如果沒(méi)有設(shè)置Cookie失效日期,它們僅保存到關(guān)閉瀏覽器程序?yàn)橹?如果將Cookie對(duì)象的Expires屬性設(shè)置為Minvalue,則表示Cookie永遠(yuǎn)不會(huì)過(guò)期.Cookie存儲(chǔ)的數(shù)據(jù)量很受限制,大多數(shù)瀏覽器支持最大容量為4096,因此不要用來(lái)保存數(shù)據(jù)集及其他大量數(shù)據(jù).由于并非所有的瀏覽器都支持Cookie,并且數(shù)據(jù)信息是以明文文本的形式保存在客戶(hù)端的計(jì)算機(jī)中,因此最好不要保存敏感的,未加密的數(shù)據(jù),否則會(huì)影響網(wǎng)站的安全性.使用Cookie對(duì)象保存的代碼如下:
//存放信息
Response.Cookies["UserID"].Value="0001";
//讀取信息
string UserID=Response.Cookies["UserID"].Value;
4.ViewState對(duì)象
ViewState 常用于保存單個(gè)用戶(hù)的狀態(tài)信息,有效期等于頁(yè)面的生存期。ViewState容器可以保持大量的數(shù)據(jù),但是必須謹(jǐn)慎使用,因?yàn)檫^(guò)多使用會(huì)影響應(yīng)用程序的性能。所有Web服務(wù)器控件都使用ViewState在頁(yè)面回發(fā)期音保存自己的狀態(tài)信息。如果某個(gè)控件不需要在回發(fā)期間保存狀態(tài)信息,最好關(guān)閉該對(duì)象的ViewState,避免不必要的資源浪費(fèi)。通過(guò)給@Page指令添加“EnableViewState=false”屬性可以禁止整個(gè)頁(yè)面的ViewState。使用ViewState對(duì)象保存信息的代碼如下。
//存放信息
ViewState["nameID"]="0001";
//讀取信息
string NameID=ViewState["nameID"].ToString();

5.Cache對(duì)象
Cache對(duì)象用于在HTTP請(qǐng)求間保存頁(yè)面或數(shù)據(jù)。該對(duì)象的使用可以極大地提高整個(gè)應(yīng)用程序的效率。它允許將頻繁訪問(wèn)的大量服務(wù)器資源存儲(chǔ)在內(nèi)存中,當(dāng)用戶(hù)發(fā)出相同的請(qǐng)求后服務(wù)器不再次處理而是將Cache中保存的信息返回給用戶(hù),節(jié)省了服務(wù)器處理請(qǐng)求的時(shí)間。此對(duì)象的實(shí)例是每個(gè)應(yīng)用程序?qū)S玫模渖嫫谝蕾?lài)于該應(yīng)用程序的生存期。當(dāng)重新啟動(dòng)應(yīng)用程序時(shí),將重新創(chuàng)建其Cache對(duì)象的實(shí)例。使用Cache對(duì)象保存信息的代碼如下。
//存放信息
Cache["nameID"]="0001";
//存放信息
Cache.Insert("nameID","0001"1);
//讀取信息
string NameID=Cache["nameID"].ToString();
6.隱藏域
Hidden控件是屬于HTML類(lèi)型的服務(wù)器控件,使用此控件可以實(shí)現(xiàn)隱藏域的功能。其實(shí)此控件和其它服務(wù)器控件的使用沒(méi)有太大區(qū)別,只是它不會(huì)在用戶(hù)端的瀏覽器中顯示,始終處于隱藏狀態(tài)。但是每次頁(yè)面提交的時(shí)候,此控件和其它服務(wù)器控件一同提交到服務(wù)器端,因此在服務(wù)器端可以使用Value屬性獲取或保存一些數(shù)據(jù)信息。使用Hidden控件保存信息的代碼如下。
//存放信息
Hidden.Value="0001";
//獲取信息
string NameID=Hidden.Value;
7.查詢(xún)字符串
查詢(xún)字符串的方式是將要傳遞的值連接在URL后面,然后通過(guò)Response.Redirect方法實(shí)現(xiàn)客戶(hù)端的重定向。這種方式可以實(shí)現(xiàn)在兩個(gè)頁(yè)面之間傳遞信息。由于URL的長(zhǎng)度有一定的限制,因此不能傳遞太大的信息,加外安全性也不是很好。
傳遞信息如下。
Response.Redirect("List.aspx?nameID=0001&gradeID=002");
//執(zhí)行上面的語(yǔ)句后在IE地址欄顯示的URL的代碼如下。
http://localhost/List.aspx?nameID=0001&grade=002
//當(dāng)跳轉(zhuǎn)到List.aspx后,可以通過(guò)以下代碼獲得所傳遞的信息。
string NameID.GradeID;
NameID=Request.Params["nameID"];
GradeID=Request.Params["gradeID"];
除了以上介紹的幾種對(duì)象外,還可以使用Context對(duì)象和Web.Config配置文件。