ASP.NET 在线用户列表

转载 2007年09月20日 16:36:00

1、用文件记录,每次访问文件:死锁问题严重,资源耗费太大。
2、用数据库记录:访问损耗大。
3、用Global.asax和Timer实现统计:比较可取。
下面举个例子:

总的来说,要做个在线人数统计简单,但是要做在线名单并且保存用户的访问日志,就需要耗费比较多的系统资源,是否划算就难说了(我只看需求文档,其他不管...);

前面用过的IHttpModule方法也不错

using System;
using System.ComponentModel;
using System.Web;
using System.Web.SessionState;
using System.Data;
using System.Data.OleDb;

namespace Butterfly{
/// <summary>
/// Global 的摘要说明。
/// </summary>
public class Global : System.Web.HttpApplication
{
        private static System.Threading.Timer timer;
        private const int interval = 1000 * 60 * 10;//检查在线用户的间隔时间
       
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.IContainer components = null;

public Global()
{
InitializeComponent();
}

protected void Application_Start(Object sender, EventArgs e)
{
            if (timer == null)
                timer = new System.Threading.Timer(new System.Threading.TimerCallback(ScheduledWorkCallback),
                    sender, 0, interval);

            DataTable userTable = new DataTable();
            userTable.Columns.Add("UserID");//用户ID
            userTable.Columns.Add("UserName");//用户姓名
            userTable.Columns.Add("FirstRequestTime");//第一次请求的时间
            userTable.Columns.Add("LastRequestTime");//最后一次请求的时间
            userTable.Columns.Add("ClientIP");//
            userTable.Columns.Add("ClientName");//
            userTable.Columns.Add("ClientAgent");//
            //userTable.Columns.Add("LastRequestPath");//最后访问的页面

            userTable.PrimaryKey = new DataColumn[]{userTable.Columns[0]};
            userTable.AcceptChanges();

            Application.Lock();
            Application["UserOnLine"] = userTable;
            Application.UnLock();
}
 
protected void Session_Start(Object sender, EventArgs e)
{

        }

        protected void Application_BeginRequest(Object sender, EventArgs e)
{
           
}

protected void Application_EndRequest(Object sender, EventArgs e)
{

}

        protected void Application_AcquireRequestState(Object sender, EventArgs e)
        {
            HttpApplication mApp = (HttpApplication)sender;
            if(mApp.Context.Session == null) return;
            if(mApp.Context.Session["UserID"]==null ) return;
            string userID = mApp.Context.Session["UserID"].ToString();
           
            DataTable userTable = (DataTable)Application["UserOnLine"];
            DataRow curRow = userTable.Rows.Find(new object[]{userID});
            if(curRow != null)
            {
                this.GetDataRowFromHttpApp(mApp,ref curRow);
            }
            else
            {
                DataRow newRow = userTable.NewRow();
                this.GetDataRowFromHttpApp(mApp,ref newRow);
                userTable.Rows.Add(newRow);
            }
            userTable.AcceptChanges();

            Application.Lock();
            Application["UserOnLine"] = userTable;
            Application.UnLock();

        }

protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
          
}

protected void Application_Error(Object sender, EventArgs e)
{
           
}

      
protected void Session_End(Object sender, EventArgs e)
{
           
}

protected void Application_End(Object sender, EventArgs e)
{
           
}

#region Web 窗体设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{   
            this.components = new System.ComponentModel.Container();
           
        }
#endregion

        private void GetDataRowFromHttpApp(HttpApplication mApp,ref DataRow mRow)
        {
            if(mApp.Context.Session == null) return;
            if(mApp.Context.Session["UserID"]==null || mApp.Context.Session["UserName"]==null) return;
            string userID = mApp.Context.Session["UserID"].ToString();
            string userName = mApp.Context.Session["UserName"].ToString();
            //string requestPath = mApp.Request.Path;
           
            if(mRow["UserID"].ToString().Length<1)
            {
                mRow["UserID"]      = userID;
                mRow["UserName"]    = userName;
                mRow["FirstRequestTime"] = System.DateTime.Now;
                mRow["ClientIP"]    = mApp.Context.Request.UserHostAddress;
                mRow["ClientName"]  = mApp.Context.Request.UserHostName;
                mRow["ClientAgent"] = mApp.Context.Request.UserAgent;
            }

            mRow["LastRequestTime"] = System.DateTime.Now;
            //mRow["LastRequestPath"] = requestPath;
           
        }

        private void ScheduledWorkCallback (object sender)
        {
            string filter = "Convert(LastRequestTime,'System.DateTime') < Convert('" + System.DateTime.Now.AddSeconds(-interval/1000).ToString() + "','System.DateTime')";
            DataTable userTable = (DataTable)Application["UserOnLine"];
            DataRow[] lineOutUsers = userTable.Select(filter);
            for(int i=0;i<lineOutUsers.Length;i++)
            {
                DataRow curRow = lineOutUsers[i];
               
                //保存到数据库
               
               curRow.Delete();
               
            }
            userTable.AcceptChanges();

            Application.Lock();
            Application["UserOnLine"] = userTable;
            Application.UnLock();
        }

      
}
}
补充:
    在线人数比较好做,在线名单就不好做了,
    另外,<sessionState> 设为InProc方式时才可以触发SessionEnd事件,其它
          Off 指示会话状态未启用。    
          StateServer 指示在远程计算机上存储会话状态。
          SQLServer 指示在 SQL Server 上存储会话状态。
    几种方式就不能触发SessionEnd事件;
    无论以何种解决方案,都很难做到准确,就像QQ,对方掉线了,你也只能过一会才知道
 

相关文章推荐

Asp.Net制作聊天室(显示在线用户列表,禁止发言,允许发言,踢出聊天室,退出聊天室)

最近做一个项目,需要一个聊天室所以就做了,因为是第一次做,而且也不清楚别人聊天室是怎么做的,只能闭门造车了,憋了一周多才做出来,而且还有很多地方不太完美。在此贴出来,希望大家多多指点。聊天室的基本效果...

asp.net 在线用户列表统计

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

ASP.NET在线用户列表精确版——解决用户意外退出在线列表无法及时更新问题

最近所做的一个项目需要用到的在线用户列表,上网搜索了一下发现现有的解决方案对用户意外退出的处理均不是太理想。一般来说,用户离开系统的方式有三种: 主动注销、会话超时、直接关闭浏览器,对于前两种,我们很...

ASP.NET中在线用户统计

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

ASP.NET在线用户

ASP_NET中在线用户统计

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

ASP.NET 在线QQ浮动咨询代码

以下代码存为一个用户控件ascx文件,在你要引用的地方引用就行了:
  • sabic
  • sabic
  • 2012-02-23 11:53
  • 4738

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

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

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

通常在整个过程中,大多数人对Application_End()这个事件的疑问是最大的,因为如果您只是在VisualStudio上做的测试的话,关闭系统时,没有触发Application_End()事件...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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