ASP.NET 在线统计的研究

原创 2007年09月18日 17:49:00

其实刚进公司的时候就发现公司的OA系统上有在线统计功能,但那时候没有心情来研究这个东西,这不最近闲的慌,就研究了下它.

这一研究,还真有满多学问在里面的.对于我个人的理解,在线统计的实时性不高,即一般不可能做到有人离开马上就改变在线人数的. 

而离开又分两种情况:第一种是用户点击退出离开的,第二种是用户直接关闭浏览器的(即非正常离开的).

第一种情况实时性要高点,好处理,毕竟是点击了退出按钮触发了事件的.而对于第二种情况的话,根本不存在实时性可言,而只能尽快的发现这个用户已经离开.

首先新建一个Global.asax文件.在这个文件里面的Application_start中写:

Hashtable ht = new Hashtable();
Application[
"UserName"= ht;

Hashtable是一个键/值对,键用用户的登录名,值用用户活动的当前时间.(后面用到的Hashtable都是如此)

在Session_end中写:

       Hashtable ht = (Hashtable)Application["UserName"];
        
foreach (DictionaryEntry item in ht)
        
...{
            
if (DateTime.Parse(item.Value.ToString()).AddSeconds(20.0< DateTime.Now)
            
...{
                ht.Remove(item.Key);
            }

        }

这里要补充说明下,有两种情况会触发Session_end事件.第一种是Session超时,第二种就是调用Session.Abandon()的时候.看到这里读者应该能猜到怎么处理用户非法离开的情况了把?没错,用户非法离开,那只能等Session超时了,然后就会触发Session_end事件,将Hashtable中该用户名删除.这里我们判断用户是不是非法离开的方法是,用用户最后一次活动时间加上20秒和当前时间进行比较,如果小的话,就表示用户已经离开了本站了.这里只是举例子,一般都不只20秒的.

在登录按钮中写:

protected void btnLogin_Click(object sender, EventArgs e)
    
...{
        SqlConnection conn 
= new SqlConnection("server=localhost;database=test;uid=sa;pwd=");
        SqlCommand cmd 
= conn.CreateCommand();
        conn.Open();
        cmd.CommandText 
= "select * from UserInfo where username='" + txtUserName.Text + "' and userpwd='" + txtPwd.Text + "'";
        SqlDataReader sdr 
= cmd.ExecuteReader();
        
if (sdr.Read())
        
...{
            Session[
"UserName"= txtUserName.Text;
            
string str=DateTime.Now.ToString();
            Session[
"Key"= str;
            Hashtable ht 
= (Hashtable)Application["UserName"];
            ht.Add(txtUserName.Text,str);
            

            Response.Redirect("index.aspx");
        }

        
else
        
...{
            Response.Write(
"<script>alert('用户名或密码错误');</script>");
        }

    }
index.aspx页面中有一个iframe和一个JS函数还有退出按钮需要注意.iframe的src是main.aspx,而main.aspx中的内容是在线统计信息.JS函数是用来不断的刷新这个IFRAME.
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="index.aspx.cs" Inherits="index" %>

<!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>
    
<script>
    function getUser()
    
...{
        ifr.document.location.href
=ifr.document.location.href;
        window.setTimeout(
'getUser()',30000);
    }

    
</script>
</head>
<body onload="getUser()">
    
<form id="form1" runat="server">
    
<div>
    
<iframe id="ifr" name="ifr" src="main.aspx"></iframe>
        
<asp:Button ID="btnCancle" runat="server" OnClick="btnCancle_Click" Text="退出" /></div>
    
</form>
</body>
</html>
index.aspx.cs中的退出按钮事件委托:
 protected void btnCancle_Click(object sender, EventArgs e)
    
...{
        Hashtable ht 
= (Hashtable)Application["UserName"];
        
        ht.Remove(Session[
"UserName"].ToString());
        Session.Clear();
        Session.Abandon();
        Response.Write(
"<script>window.opener=null;window.close();</script>");
    }
main.aspx.cs在page_load中写:
if(!IsPostBack)
        
...{
            Session.Timeout 
+= 1;
            Response.Write(Session.Timeout);
            Response.Write(Session[
"UserName"].ToString());
            
if (Session["Key"].ToString() == DateTime.Now.ToString())
            
...{
                Response.Write(
"YES");
            }

            
else
            
...{
                Response.Write(
"NO");
            }

            Hashtable ht 
= (Hashtable)Application["UserName"];

            ht[Session[
"UserName"].ToString()] = DateTime.Now.ToString();
            
string str = "UserList:";
            
string str1 = "";
            
foreach (DictionaryEntry item in ht)
            
...{
                str 
+= "|" + item.Value.ToString();
                str1 
+= item.Key.ToString() + ",";
            }

            Response.Write(str);
            
            Response.Write(str1);
        }

每被刷新一次,Session的过期时间就会加1分钟,这样做是为了区别当Session过期和用户点击退出同时成立的情况.

只有当用户没有离开该页面,该页面才会被刷新,被刷新了Session过期时间就加1分钟.而用户直接关闭浏览器了该页面就不会被刷新,Session就会更早的过期.

ASP.NET MVC5+EF6+EasyUI 后台管理系统(39)-在线人数统计探讨

系列目录 基于web的网站在线统计一直处于不是很精准的状态!基本上没有一种方法可以确实的统计在线用户! Discuz!NT 在线用户功能算是做得比较好的!参考资料 他的原理大致是根据用户的操作间...
  • ymnets
  • ymnets
  • 2017年11月29日 08:40
  • 12

使用ASP.NET的Application对象实现在线人数统计的功能

注:最近在复习ASP.NET,为了加深印象,会制作一些小的demo程序,分享给大家。 1 新建ASP.NET网站,编辑Global.asax文件,修改后的文件内容如下所示。 ...
  • tiana0
  • tiana0
  • 2015年04月04日 11:14
  • 2487

ASP.NET中利用Application和Session统计在线人数、历史访问量

通常在整个过程中,大多数人对Application_End()这个事件的疑问是最大的,因为如果您只是在VisualStudio上做的测试的话,关闭系统时,没有触发Application_End()事件...

asp.net 在线用户列表统计

在线人员统计,Global.asax: using System; using System.Collections; using System.Configuration; using Sy...

asp.net统计在线人数

统计在线用户的作用不言而喻,就是为了网站管理者可以知道当前用户的多少,然后根据用户数量来观察服务器或者程序的性能,从而可以直观的了解到网站的吸引力或者网站程序的效率。现在,我们就介绍一个简单明了的方法...

asp.net 实现在线人数统计

在解决方案资源管理器中添加新项,Global.asax,其中代码如下: void Application_Start(object sender, EventArgs e) ...

构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(40)-精准在线人数统计实现-【过滤器+Cache】

系列目录 上次的探讨没有任何结果,我浏览了大量的文章和个别系统的参考!决定用Cache来做,这可能有点难以接受但是配合mvc过滤器来做效果非常好! 由于之前的过滤器我们用过了OnActionExe...
  • ymnets
  • ymnets
  • 2016年02月22日 13:00
  • 775

asp.net 在线人数统计,页面访问量 Application ,session

asp.net 在线人数统计,页面访问量 Application ,session 1.新建网站,添加几个窗体。webForm1.aspx ,ViewStateForm.aspx 2.在网...
  • zhexcel
  • zhexcel
  • 2012年08月15日 15:49
  • 165

【ASP.NET】——统计在线人数、历史访问人数

先介绍一下,在设计过程中,用到的Application和Session方法:

ASP.NET中在线用户统计

统计在线用户的作用不言而喻,就是为了网站管理者可以知道当前用户的多少,然后根据用户数量来观察服务器或者程序的性能,从而可以直观的了解到网站的吸引力或者网站程序的效率。现在,我们就介绍一个简单明了的方法...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ASP.NET 在线统计的研究
举报原因:
原因补充:

(最多只允许输入30个字)