摘 要: ASP.NET具有七大內(nèi)置對(duì)象, 用ASP. NET編寫(xiě)虛擬社區(qū)、網(wǎng)上購(gòu)物等B/S程序時(shí),Application和Session對(duì)象具有舉足輕重的作用,能夠靈活合理地運(yùn)用這兩個(gè)對(duì)象是提高程序質(zhì)量的關(guān)鍵。
關(guān)鍵詞: .NET 內(nèi)置對(duì)象 在線人數(shù)統(tǒng)計(jì)
一、關(guān)鍵對(duì)象分析
我們可以把Application看成一個(gè)用于存儲(chǔ)全局變量的容器,實(shí)際它只是一個(gè)對(duì)象,而ASP.NET應(yīng)用程序里面的變量,也就是容器里面的內(nèi)容。ASP.NET應(yīng)用程序是單個(gè)Web服務(wù)器上某一個(gè)虛擬目錄及其子目錄范圍內(nèi)所有文件、頁(yè)、處理程序、模塊、代碼的總和。可以在整個(gè)應(yīng)用程序范圍之內(nèi)存儲(chǔ)一些信息,我們可以用變量來(lái)存儲(chǔ)。但需要注意的是,變量的整個(gè)生命周期受限制于網(wǎng)頁(yè),即每一次ASP.NET文件被執(zhí)行完畢(Web服務(wù)器端發(fā)送代碼到客戶端后),變量的內(nèi)容便被釋放。很多時(shí)候,我們又需要保留這個(gè)內(nèi)容,比如論壇系統(tǒng),每次刷新后,頁(yè)面的內(nèi)容仍然要存在,這就需要Application來(lái)存儲(chǔ)。利用Application對(duì)象存儲(chǔ)的變量及對(duì)象在整個(gè)應(yīng)用程序內(nèi)執(zhí)行的所有ASP.NET頁(yè)面都是可用的。Application中存儲(chǔ)的是全局變量,這些變量占用了系統(tǒng)較多的內(nèi)存資源,在這個(gè)變量沒(méi)有被替代之前,所占用的資源是不會(huì)被釋放的。
Session對(duì)象和Application有很大不同。Application對(duì)象存儲(chǔ)信息是整個(gè)應(yīng)用程序所共享的全局信息,每一個(gè)客戶都能夠訪問(wèn)到的相同信息,針對(duì)整個(gè)應(yīng)用程序,并且整個(gè)程序里的每一個(gè)用戶。Session對(duì)象的作用是在服務(wù)器端存儲(chǔ)特定局部的的信息,是針對(duì)特定的一個(gè)用戶,Session中的信息也叫做會(huì)話狀態(tài)。我們用一個(gè)例子來(lái)說(shuō)明Session的使用。比如設(shè)計(jì)一個(gè)論壇。我們進(jìn)入論壇,提交用戶名和密碼后,發(fā)帖子、留言等都不需要再用用戶名和密碼了,這是因?yàn)橐呀?jīng)保留了注冊(cè)信息。我們登陸成功后,該系統(tǒng)已經(jīng)把用戶名和密碼等存放進(jìn)了Session對(duì)象,然后把信息返回到服務(wù)器,當(dāng)轉(zhuǎn)到下一個(gè)頁(yè)面時(shí),再?gòu)姆?wù)器取出信息來(lái)使用。我們留言或者發(fā)帖子的時(shí)候,就從 Web服務(wù)器的Session中取出用戶名和密碼來(lái)判斷我們是否有權(quán)利這么做。
ASP.NET的Application和Session對(duì)象,體現(xiàn)了其他ASP.NET內(nèi)置對(duì)象所沒(méi)有的特征,即事件。每一個(gè)用戶訪問(wèn)服務(wù)器時(shí)都會(huì)觸發(fā)一個(gè)OnStart事件,每個(gè)訪客的會(huì)話結(jié)束時(shí)都會(huì)觸發(fā)一個(gè)OnEnd事件。OnStart和OnEnd這兩個(gè)事件一般應(yīng)用于虛擬社區(qū)中統(tǒng)計(jì)在線人數(shù)、修改用戶的在線離線狀態(tài)等。要具體定義這兩個(gè)事件,需要將代碼寫(xiě)在Global.asa文件,并將該文件放在站點(diǎn)的根目錄下(缺省是\\Inetpub\\wwwroot\\)。另外,Application和Session對(duì)象規(guī)定了在OnEnd事件里除了Application對(duì)象外其他ASP內(nèi)置對(duì)象(Response、Request、Server、Session……)一概不能使用。以下舉一個(gè)虛擬社區(qū)統(tǒng)計(jì)在線人數(shù)的例子來(lái)說(shuō)明如何使用這兩個(gè)事件。
二、具體實(shí)現(xiàn)方法
在本例中,用application[\"online\"]變量記錄已經(jīng)登錄社區(qū)的在線人數(shù),因?yàn)橐坏┯杏脩粼L問(wèn)服務(wù)器而不論用戶是否登錄,都會(huì)產(chǎn)生OnStart事件,所以不能在OnStart事件里使Application[\"online\"]加一。因?yàn)椴徽撌欠袷堑卿浻脩舻臅?huì)話結(jié)束都會(huì)產(chǎn)生OnEnd事件(假如有訪客訪問(wèn)了服務(wù)器但并不登錄社區(qū),他的會(huì)話結(jié)束后也會(huì)產(chǎn)生OnEnd事件),所以在Session_OnEnd事件里用了if語(yǔ)句來(lái)判斷是否為已登錄用戶的OnEnd事件,如果是才將在線人數(shù)減一。
1.Global文件部分代碼
void Application_Start(object sender, EventArgse)
{
Application[\"total\"] = 0;//總?cè)藬?shù)
Application[\"online\"] = 0;//在線人數(shù)
//在應(yīng)用程序啟動(dòng)時(shí)運(yùn)行的代碼
}
void Session_Start(object sender, EventArgse)
{
Session.Timeout = 1;
Application.Lock();//防止并發(fā)
Application[\"total\"]=(int)Application[\"total\"]+1;
Application[\"online\"]=(int)Application[\"online\"]+1;
Application.UnLock();
}
void Session_End(object sender, EventArgse)
{
Session.Timeout = 1;
Application.Lock();
Application[\"online\"] = (int)Application[\"online\"] -1;
Application.UnLock();
}
2.CS文件部分代碼
protected void Page_Load(object sender, EventArgse)
{
this.l2.Text = Application[\"online\"].ToString();
this.l4.Text = Application[\"total\"].ToString();
}
至此,關(guān)鍵的代碼已經(jīng)完成了。在Application和Session的OnEnd事件里不能使用Server對(duì)象,所以要將數(shù)據(jù)庫(kù)的連接及數(shù)據(jù)庫(kù)在服務(wù)器上的物理地址(d:\\inetpub\\wwwroot\\bbs.mdb)存儲(chǔ)在application變量中,并在Application_OnStart事件中預(yù)先處理。同理,在Session_OnEnd事件中不能用session[\"pass\"]來(lái)代替session.contents[\"pass\"]。
這只是一個(gè)統(tǒng)計(jì)在線人數(shù)的簡(jiǎn)單例子,對(duì)于一個(gè)完整的虛擬社區(qū)來(lái)說(shuō),僅僅統(tǒng)計(jì)有多少人在線是不夠的,在本例中數(shù)據(jù)庫(kù)里有個(gè)online字段是用來(lái)記錄用戶的在線狀態(tài),用戶登錄的時(shí)候,在login.asp里將online設(shè)為1,但用戶離線時(shí)并沒(méi)有將online設(shè)為0,要完善它,就要修改一下Session_OnEnd事件,在該事件里將online設(shè)為0。