摘 要: ASP.NET具有七大內置對象, 用ASP. NET編寫虛擬社區、網上購物等B/S程序時,Application和Session對象具有舉足輕重的作用,能夠靈活合理地運用這兩個對象是提高程序質量的關鍵。
關鍵詞: .NET 內置對象 在線人數統計
一、關鍵對象分析
我們可以把Application看成一個用于存儲全局變量的容器,實際它只是一個對象,而ASP.NET應用程序里面的變量,也就是容器里面的內容。ASP.NET應用程序是單個Web服務器上某一個虛擬目錄及其子目錄范圍內所有文件、頁、處理程序、模塊、代碼的總和。可以在整個應用程序范圍之內存儲一些信息,我們可以用變量來存儲。但需要注意的是,變量的整個生命周期受限制于網頁,即每一次ASP.NET文件被執行完畢(Web服務器端發送代碼到客戶端后),變量的內容便被釋放。很多時候,我們又需要保留這個內容,比如論壇系統,每次刷新后,頁面的內容仍然要存在,這就需要Application來存儲。利用Application對象存儲的變量及對象在整個應用程序內執行的所有ASP.NET頁面都是可用的。Application中存儲的是全局變量,這些變量占用了系統較多的內存資源,在這個變量沒有被替代之前,所占用的資源是不會被釋放的。
Session對象和Application有很大不同。Application對象存儲信息是整個應用程序所共享的全局信息,每一個客戶都能夠訪問到的相同信息,針對整個應用程序,并且整個程序里的每一個用戶。Session對象的作用是在服務器端存儲特定局部的的信息,是針對特定的一個用戶,Session中的信息也叫做會話狀態。我們用一個例子來說明Session的使用。比如設計一個論壇。我們進入論壇,提交用戶名和密碼后,發帖子、留言等都不需要再用用戶名和密碼了,這是因為已經保留了注冊信息。我們登陸成功后,該系統已經把用戶名和密碼等存放進了Session對象,然后把信息返回到服務器,當轉到下一個頁面時,再從服務器取出信息來使用。我們留言或者發帖子的時候,就從 Web服務器的Session中取出用戶名和密碼來判斷我們是否有權利這么做。
ASP.NET的Application和Session對象,體現了其他ASP.NET內置對象所沒有的特征,即事件。每一個用戶訪問服務器時都會觸發一個OnStart事件,每個訪客的會話結束時都會觸發一個OnEnd事件。OnStart和OnEnd這兩個事件一般應用于虛擬社區中統計在線人數、修改用戶的在線離線狀態等。要具體定義這兩個事件,需要將代碼寫在Global.asa文件,并將該文件放在站點的根目錄下(缺省是\\Inetpub\\wwwroot\\)。另外,Application和Session對象規定了在OnEnd事件里除了Application對象外其他ASP內置對象(Response、Request、Server、Session……)一概不能使用。以下舉一個虛擬社區統計在線人數的例子來說明如何使用這兩個事件。
二、具體實現方法
在本例中,用application[\"online\"]變量記錄已經登錄社區的在線人數,因為一旦有用戶訪問服務器而不論用戶是否登錄,都會產生OnStart事件,所以不能在OnStart事件里使Application[\"online\"]加一。因為不論是否是登錄用戶的會話結束都會產生OnEnd事件(假如有訪客訪問了服務器但并不登錄社區,他的會話結束后也會產生OnEnd事件),所以在Session_OnEnd事件里用了if語句來判斷是否為已登錄用戶的OnEnd事件,如果是才將在線人數減一。
1.Global文件部分代碼
void Application_Start(object sender, EventArgse)
{
Application[\"total\"] = 0;//總人數
Application[\"online\"] = 0;//在線人數
//在應用程序啟動時運行的代碼
}
void Session_Start(object sender, EventArgse)
{
Session.Timeout = 1;
Application.Lock();//防止并發
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();
}
至此,關鍵的代碼已經完成了。在Application和Session的OnEnd事件里不能使用Server對象,所以要將數據庫的連接及數據庫在服務器上的物理地址(d:\\inetpub\\wwwroot\\bbs.mdb)存儲在application變量中,并在Application_OnStart事件中預先處理。同理,在Session_OnEnd事件中不能用session[\"pass\"]來代替session.contents[\"pass\"]。
這只是一個統計在線人數的簡單例子,對于一個完整的虛擬社區來說,僅僅統計有多少人在線是不夠的,在本例中數據庫里有個online字段是用來記錄用戶的在線狀態,用戶登錄的時候,在login.asp里將online設為1,但用戶離線時并沒有將online設為0,要完善它,就要修改一下Session_OnEnd事件,在該事件里將online設為0。