ASP.NET中利用Application和Session統計在線人數、歷史訪問量

轉載自:http://www.tuicool.com/articles/qyE3e2a數據庫

先來簡單說一下ASP.NET中的Application和Session數組

下圖是咱們很是熟悉的Web應用程序的結構:瀏覽器

在這張圖中,Web服務器中運行的Web應用程序就是咱們所說的Application,每一個客戶端與Web服務器之間創建的鏈接就能夠看作是一個Session。好比如今服務器端運行的是一個論壇系統,那麼如今這個正運行在服務器端的論壇系統的軟件就能夠看作Application,而每一個在線的用戶與之創建的鏈接就至關於一個Session。服務器

那麼很容易就會理解,Application是共享的,至關於「全局變量」,Session不是共享的,是屬於每一個客戶端(瀏覽器)私有的。測試

因此上圖用Application和Session 能夠 表示爲:ui

Applicationspa

經常使用屬性:server

      屬性     說明
All 返回所有的Application對象變量到一個對象數組
AllKeys 返回所有的Application對象變量到一個字符串數組
Count 返回Application中對象變量的數量

經常使用方法:對象

  方法  說明
Add 新增一個Application變量值
Clear 清空所有Application變量值
Get 變量名傳回的變量值
Set 更新Application變量值
Lock 鎖定全部Application的變量值
UnLock 解除鎖定Application的變量值

        Sessionblog

經常使用屬性:

          屬性         說明
Count  獲取會話狀態集合中Session對象的個數
Contents 獲取對當前會話狀態對象的引用
Keys 獲取存儲在會話中的全部值的集合
SessionID 獲取用於標識會話的惟一會話ID
TimeOut  獲取或設置會話狀態提供程序終止會話以前所容許的超時期限
Mode 獲取當前會話狀態模式

 

經常使用方法:

    方法     說明
Add 新增一個Session對象
Clear 清除會話狀態中的全部值
CopyTo 將會話狀態值的集合富之島一維數組中
Remove 刪除會話狀態集合中的項
RemoveAll 清除全部會話狀態的值

ASP.NET中統計在線人數和歷史訪問人數,還須要四個事件:Application_Start()事件、Application_End()、Session_Start()事件和Session_End()事件。

當程序啓動時,會首先在Global.asax.cs文件中觸發Application的Application_Start()事件,咱們須要在這個事件中增長兩個Application變量值(由於這兩個值是Application中的變量值,因此就至關於整個程序的「公共變量」):totalCount(用來表示總的訪問量)、onlineCount(用來表示當前在線人數):         

protected void Application_Start()   {    string strConn = "server=192.168.24.123;database=數據庫名;uid=sa;pwd=123456;"; //數據庫鏈接字符串    SqlConnection conn = new SqlConnection(strConn); //實例化數據庫鏈接對象    conn.Open(); //打開數據庫鏈接    string cmdText = "select count from Count"; //定義查詢字符串    SqlCommand cmd = new SqlCommand(cmdText, conn); //實例化命令對象    int count = (int)cmd.ExecuteScalar(); //取出數據庫中歷史訪問人數    Application["total"] = count; //定義Application變量值total並賦值爲歷史訪問量    Application["onLine"] = 0; //定義Application變量值onLine並賦值爲0   }

 

下面就要編寫Session_Start()事件代碼,當每一個客戶端(瀏覽器)訪問服務器時,就會觸發Session_Start()事件,這事就要讓「公共變量」totalCount和onlineCount都自增1,這時,當有多個客戶端同時訪問時,就有可能發生錯誤,因此要Application的Lock()方法先把Application中的變量鎖起來(Application執行了Lock()方法以後, 整站中全部關於Application的操做都會被鎖定延時執行,包括Application賦值和Application讀取),只讓一個客戶端進行這兩個變量的自增,以後再進行解鎖,供其餘客戶端進行操做:      

protected void Session_Start()   {    Application.Lock(); //鎖定Application    Application["total"] = (int)Application["total"] + 1; //總訪問量加1    Application["onLine"] = (int)Application["onLine"] + 1; //在線人數加1    Application.UnLock(); //解除鎖定   }

如今在線人數和歷史訪問數量都統計出來了,須要顯示的時候直接調用Application["變量值"]就能夠,好比要在名爲Label的控件上顯示在線人數,只需Label.Text=Application["onLine"].ToString()就OK了!須要 注意 的是,Application和Session中存儲的變量值都是object類型的,給他們賦值的時候能夠直接賦值,可是取出的時候就須要考慮類型了。

當一個客戶端(瀏覽器)與服務器斷開鏈接(即此客戶端與服務器的會話關閉)時,會觸發Session_End()事件,這時歷史訪問數量不改變,在線人數須要減1:

protected void Session_End() { Application.Lock(); //鎖定Application Application["onLine"] = (int)Application["onLine"] - 1; //總訪問數量不變,在線人數減1 Application.UnLock(); //解除鎖定 }

 

爲了方便測試,上面的例子能夠經過在一臺電腦上開啓多個瀏覽器,也就至關於與服務器創建了多個Session,也許您測試的時候會發現一個問題,假如如今在線人數是10,您關閉了某個瀏覽器時,測試當前的在線人數即Application["onLine"]的值仍是10 ,並無執行「減1」操做。這是由於Session的TimeOut值默認是20分鐘,也就是說,默認狀況下,關閉了瀏覽器並不表明這個瀏覽器和服務器之間的鏈接已經斷開,而要等待20分鐘以後纔會斷開鏈接。(爲了測試效果,您能夠將TimeOut的值設置小一點)

最後,假如服務器要關閉,就要把目前Application中存儲的歷史訪問總數從新更新到數據庫中,須要在Application_End()事件中進行:

protected void Application_End()   {    string strConn = "server=192.168.24.123;database=數據庫名;uid=sa;pwd=123456;"; //定義數據庫鏈接字符串    SqlConnection conn = new SqlConnection(strConn); //實例化數據庫鏈接對象    conn.Open(); //打開數據庫鏈接    string cmdText = "update Count set count=@count"; //定義執行命令    SqlCommand cmd = new SqlCommand(cmdText, conn); //實例化命令對象    cmd.Parameters.Add(new SqlParameter("@count", Application["total"])); //爲參數@count賦值爲如今的總訪問量    cmd.ExecuteNonQuery(); //執行命令    conn.Close(); //關閉數據庫   }

一般在整個過程當中,大多數人對Application_End()這個事件的疑問是最大的,由於若是您只是在VisualStudio上作的測試的話,關閉系統時,沒有觸發Application_End()事件,新的數據也就沒有被寫入到數據庫中。那麼Application_End()究竟在何時纔會被觸發呢 ?

想弄明白這個問題,須要將程序發佈,這裏以IIS爲例,用IIS發佈了程序以後運行,當想要觸發Application_End()事件把最新的歷史訪問量寫入到 數據庫中時,須要在IIS中關閉此程序的運行,以下圖:

注意 :只是在服務器上中止該程序的運行纔會觸發Application_End()事件,重啓和斷電等狀況並不能觸發。

 

雖然統計在線人數和歷史訪問量是個並不起眼的小功能,可是經過捋一遍,細細地總結了一下,又學到了好多東西,腦子裏的知識網又增大了一點點。。。。

相關文章
相關標籤/搜索