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

來源:互聯網
上載者:User

標籤:

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

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

是我們非常熟悉的Web應用程式的結構:

在這張圖中,Web伺服器中啟動並執行Web應用程式就是我們所說的Application,每個用戶端與Web伺服器之間建立的串連就可以看做是一個Session。比如現在伺服器端啟動並執行是一個論壇系統,那麼現在這個正運行在伺服器端的論壇系統的軟體就可以看做Application,而每個線上的使用者與之建立的串連就相當於一個Session。

那麼很容易就會理解,Application是共用的,相當於“全域變數”,Session不是共用的,是屬於每個用戶端(瀏覽器)私人的。

所以用Application和Session 可以 表示為:

Application

常用屬性:

      屬性     說明
All 返回全部的Application物件變數到一個對象數組
AllKeys 返回全部的Application物件變數到一個字串數組
Count 返回Application中物件變數的數量

常用方法:

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

        Session

常用屬性:

          屬性         說明
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 [email protected]"; //定義執行命令      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()事件,重啟和斷電等情況並不能觸發。

 

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

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.