Asp.net在线统计人数
在設(shè)計(jì)網(wǎng)站時(shí),網(wǎng)站被訪問(wèn)情況和用戶使用情況是網(wǎng)站設(shè)計(jì)的一個(gè)重點(diǎn)。
?????????利用Application對(duì)象和Session對(duì)象可以統(tǒng)計(jì)當(dāng)前在線用戶數(shù)量。下面分別介紹這兩個(gè)對(duì)象。
????????(1)Application對(duì)象是HttpApplication類的實(shí)例。它可以在多個(gè)請(qǐng)求、連接之間共享公用信息,也可以在各個(gè)請(qǐng)求連接之間充當(dāng)信息傳遞的管道。此對(duì)象的生命周期起始于IIS開(kāi)始運(yùn)行并且有人開(kāi)始連接時(shí),終止于IIS關(guān)閉或者若干時(shí)間內(nèi)無(wú)人連接時(shí)。當(dāng)Application對(duì)象的生命周期開(kāi)始時(shí),Application_Start事件會(huì)被啟動(dòng),當(dāng)Application對(duì)象的生命結(jié)束時(shí),Application_End事件會(huì)被啟動(dòng)。本實(shí)例中,當(dāng)應(yīng)用程序啟動(dòng)時(shí),在Application_Start事件下初始化計(jì)數(shù)器。其代碼如下。
???????????? //?在應(yīng)用程序啟動(dòng)時(shí)運(yùn)行的代碼????????????????????
??????????? ?//初始化????????????????????
???????????? ?Application["counter"]?=?0;?
???????(2)Session對(duì)象是System.Web.UI.HttpSessionState類的實(shí)例。Session對(duì)象的所有引用都是在引用當(dāng)前用戶的會(huì)話對(duì)象,這個(gè)對(duì)象提供了字典風(fēng)格的訪問(wèn)機(jī)制,當(dāng)特定的用戶不再訪問(wèn)Web站點(diǎn)上的頁(yè)面時(shí),一些信息將被丟掉。在新會(huì)話啟動(dòng)時(shí),使計(jì)數(shù)器自增。但是注意的是只有在Web.config文件中的sessionstate模式設(shè)置為InProc時(shí),才會(huì)引發(fā)Session_End事件。如果會(huì)話模式為StateServer或SQLServer,則不會(huì)引發(fā)該事件。關(guān)鍵代碼如下。
???????????????? ?//?在新會(huì)話啟動(dòng)時(shí)運(yùn)行的代碼????????????????????
????????????????? //對(duì)Application加鎖以防并行性????????????????????
????????????????????????????Application.Lock();????????????????????
????????????????? //增加一個(gè)在線人數(shù)????????????????????
????????????????????????????Application["counter"]?=?(int)Application["counter"]?+?1;????????????????????
????????????????????????????Application.UnLock();?????//解鎖????????????????????????????在會(huì)話結(jié)束時(shí),使計(jì)數(shù)器自減。關(guān)鍵代碼如下。????????????????????????????????????????????????????????Application.Lock();????????????????????
????????????????????????????//減少一個(gè)在線人數(shù)????????????????????
????????????????????????????Application["counter"]?=?(int)Application["counter"]?-?1;????????????????????
????????????????????????????Application.UnLock();????????//解鎖??????????????????????????????
?注意:
????????(1)在會(huì)話開(kāi)始和結(jié)束時(shí),一定要進(jìn)行加鎖(Application.lock)和開(kāi)鎖(Application.Unlock)操作。由于多個(gè)用戶可以共享Application對(duì)象,因此對(duì)共享資源使用鎖定是必要的,這樣可以確保在同一時(shí)刻只有一個(gè)客戶可以修改和存取Application對(duì)象的屬性。如果將共享區(qū)加鎖后,遲遲不給開(kāi)鎖,可能會(huì)導(dǎo)致用戶無(wú)法訪問(wèn)Application對(duì)象。用戶可以使用該對(duì)象的Unlock方法來(lái)解除鎖定。這樣可以保證在沒(méi)有程序訪問(wèn)的情況下允許有一個(gè)客戶可以使用Application對(duì)象的共享區(qū)。
????????(2)本實(shí)例主要是根據(jù)用戶建立和退出會(huì)話來(lái)實(shí)現(xiàn)在線人數(shù)的增加、減少的,如果用戶沒(méi)有關(guān)閉瀏覽器,而直接進(jìn)入其他URL,則這個(gè)會(huì)話在一定時(shí)間內(nèi)是不會(huì)結(jié)束的,所以對(duì)用戶數(shù)量的統(tǒng)計(jì)存在一定的偏差。當(dāng)然,用戶可以在Web.config文件中對(duì)會(huì)話Session的失效時(shí)間Timeout來(lái)設(shè)置,默認(rèn)值為20分鐘,最小值為1分鐘。
實(shí)現(xiàn)過(guò)程
(1)新建一個(gè)網(wǎng)站,命名為Ex11_06,默認(rèn)主頁(yè)名為Default.aspx。
(2)然后在該網(wǎng)站中添加一個(gè)Global.asax全局應(yīng)用程序文件。
???????(3)主要程序代碼。
Global.asax文件代碼如下:
<%@ Application Language="C#" %>
<script RunAt="server">
??? void Application_Start(object sender, EventArgs e)
??? {
??????? // 在應(yīng)用程序啟動(dòng)時(shí)運(yùn)行的代碼
??? }
??? void Application_End(object sender, EventArgs e)
??? {
??????? //? 在應(yīng)用程序關(guān)閉時(shí)運(yùn)行的代碼
??????? Application["count"] = 0;
??? }
??? void Application_Error(object sender, EventArgs e)
??? {
??????? // 在出現(xiàn)未處理的錯(cuò)誤時(shí)運(yùn)行的代碼
??? }
??? void Session_Start(object sender, EventArgs e)
??? {
??????? // 在新會(huì)話啟動(dòng)時(shí)運(yùn)行的代碼
??????? //對(duì)Application加鎖以防并行性????????????????????
??????? Application.Lock();
??????? //增加一個(gè)在線人數(shù)????????????????????
??????? Application["counter"] = (int)Application["counter"] + 1;
??????? //解鎖????????????????????
??????? Application.UnLock();????????????????????
??? }
??? void Session_End(object sender, EventArgs e)
??? {
??????? // 在會(huì)話結(jié)束時(shí)運(yùn)行的代碼。
??????? // 注意: 只有在 Web.config 文件中的 sessionstate 模式設(shè)置為
??????? // InProc 時(shí),才會(huì)引發(fā) Session_End 事件。如果會(huì)話模式設(shè)置為 StateServer
??????? // 或 SQLServer,則不會(huì)引發(fā)該事件。
??????? //對(duì)Application加鎖以防并行性????????????????????
??????? Application.Lock();
??????? //減少一個(gè)在線人數(shù)????????????????????
??????? Application["counter"] = (int)Application["counter"] - 1;
??????? //解鎖????????????????????
??????? Application.UnLock();????????????????????
??? }
</script>
頁(yè)面后臺(tái)代碼如下:
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 = "當(dāng)前在線人數(shù):" + Application["count"].ToString();
??????? }
??? }
}
頁(yè)面前臺(tái)代碼:
<%@ 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>無(wú)標(biāo)題頁(yè)</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>
總結(jié)
以上是生活随笔為你收集整理的Asp.net在线统计人数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 同花顺peg指标在哪里看
- 下一篇: 设计模式到底离我们有多远