Asp.net在线统计人数
在設計網站時,網站被訪問情況和用戶使用情況是網站設計的一個重點。
?????????利用Application對象和Session對象可以統計當前在線用戶數量。下面分別介紹這兩個對象。
????????(1)Application對象是HttpApplication類的實例。它可以在多個請求、連接之間共享公用信息,也可以在各個請求連接之間充當信息傳遞的管道。此對象的生命周期起始于IIS開始運行并且有人開始連接時,終止于IIS關閉或者若干時間內無人連接時。當Application對象的生命周期開始時,Application_Start事件會被啟動,當Application對象的生命結束時,Application_End事件會被啟動。本實例中,當應用程序啟動時,在Application_Start事件下初始化計數器。其代碼如下。
???????????? //?在應用程序啟動時運行的代碼????????????????????
??????????? ?//初始化????????????????????
???????????? ?Application["counter"]?=?0;?
???????(2)Session對象是System.Web.UI.HttpSessionState類的實例。Session對象的所有引用都是在引用當前用戶的會話對象,這個對象提供了字典風格的訪問機制,當特定的用戶不再訪問Web站點上的頁面時,一些信息將被丟掉。在新會話啟動時,使計數器自增。但是注意的是只有在Web.config文件中的sessionstate模式設置為InProc時,才會引發Session_End事件。如果會話模式為StateServer或SQLServer,則不會引發該事件。關鍵代碼如下。
???????????????? ?//?在新會話啟動時運行的代碼????????????????????
????????????????? //對Application加鎖以防并行性????????????????????
????????????????????????????Application.Lock();????????????????????
????????????????? //增加一個在線人數????????????????????
????????????????????????????Application["counter"]?=?(int)Application["counter"]?+?1;????????????????????
????????????????????????????Application.UnLock();?????//解鎖????????????????????????????在會話結束時,使計數器自減。關鍵代碼如下。????????????????????????????????????????????????????????Application.Lock();????????????????????
????????????????????????????//減少一個在線人數????????????????????
????????????????????????????Application["counter"]?=?(int)Application["counter"]?-?1;????????????????????
????????????????????????????Application.UnLock();????????//解鎖??????????????????????????????
?注意:
????????(1)在會話開始和結束時,一定要進行加鎖(Application.lock)和開鎖(Application.Unlock)操作。由于多個用戶可以共享Application對象,因此對共享資源使用鎖定是必要的,這樣可以確保在同一時刻只有一個客戶可以修改和存取Application對象的屬性。如果將共享區加鎖后,遲遲不給開鎖,可能會導致用戶無法訪問Application對象。用戶可以使用該對象的Unlock方法來解除鎖定。這樣可以保證在沒有程序訪問的情況下允許有一個客戶可以使用Application對象的共享區。
????????(2)本實例主要是根據用戶建立和退出會話來實現在線人數的增加、減少的,如果用戶沒有關閉瀏覽器,而直接進入其他URL,則這個會話在一定時間內是不會結束的,所以對用戶數量的統計存在一定的偏差。當然,用戶可以在Web.config文件中對會話Session的失效時間Timeout來設置,默認值為20分鐘,最小值為1分鐘。
實現過程
(1)新建一個網站,命名為Ex11_06,默認主頁名為Default.aspx。
(2)然后在該網站中添加一個Global.asax全局應用程序文件。
???????(3)主要程序代碼。
Global.asax文件代碼如下:
<%@ Application Language="C#" %>
<script RunAt="server">
??? void Application_Start(object sender, EventArgs e)
??? {
??????? // 在應用程序啟動時運行的代碼
??? }
??? void Application_End(object sender, EventArgs e)
??? {
??????? //? 在應用程序關閉時運行的代碼
??????? Application["count"] = 0;
??? }
??? void Application_Error(object sender, EventArgs e)
??? {
??????? // 在出現未處理的錯誤時運行的代碼
??? }
??? void Session_Start(object sender, EventArgs e)
??? {
??????? // 在新會話啟動時運行的代碼
??????? //對Application加鎖以防并行性????????????????????
??????? Application.Lock();
??????? //增加一個在線人數????????????????????
??????? Application["counter"] = (int)Application["counter"] + 1;
??????? //解鎖????????????????????
??????? Application.UnLock();????????????????????
??? }
??? void Session_End(object sender, EventArgs e)
??? {
??????? // 在會話結束時運行的代碼。
??????? // 注意: 只有在 Web.config 文件中的 sessionstate 模式設置為
??????? // InProc 時,才會引發 Session_End 事件。如果會話模式設置為 StateServer
??????? // 或 SQLServer,則不會引發該事件。
??????? //對Application加鎖以防并行性????????????????????
??????? Application.Lock();
??????? //減少一個在線人數????????????????????
??????? Application["counter"] = (int)Application["counter"] - 1;
??????? //解鎖????????????????????
??????? Application.UnLock();????????????????????
??? }
</script>
頁面后臺代碼如下:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
namespace Demo
{
??? public partial class _Default : System.Web.UI.Page
??? {
??????? protected void Page_Load(object sender, EventArgs e)
??????? {
??????????? this.Label1.Text = "當前在線人數:" + Application["count"].ToString();
??????? }
??? }
}
頁面前臺代碼:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="Demo._Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
??? <title>無標題頁</title>
</head>
<body>
??? <form id="form1" runat="server">
??? <div>
??????? <asp:Label ID="Label1" runat="server" Text="Label" Width="128px"></asp:Label></div>
??? </form>
</body>
</html>
總結
以上是生活随笔為你收集整理的Asp.net在线统计人数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 同花顺peg指标在哪里看
- 下一篇: 软件专业毕业生之一个月攻略