c#如何实现显示在线用户列表的功能

2026年09月26日 17:09
有2个网友回答
网友(1):

在ASP时代,要实现一个网站的在线用户列表显示功能的惯用做法是修改global.asa文件中的:Application_Start、Session_Start和Session_End这三个函数。在ASP.NET时代,我依然这样做。但是必须注意很多问题。首先来看看最简单的代码实现:

protected void Application_Start(Object sender, EventArgs e)
{
Application.Lock();

Application["OnlineUsers"]=null;

Application.UnLock();
}

protected void Session_Start(Object sender, EventArgs e)
{
Application.Lock();

if(Application["OnlineUsers"]==null)
Application["OnlineUsers"]=new Hashtable();

Hashtable onlineUsersHash=(Hashtable)Application["OnlineUsers"];
onlineUsersHash.Add(Request.UserHostAddress, Request.Cookies["UserName"].Value);

Application.UnLock();
}

protected void Session_End(Object sender, EventArgs e)
{
Hashtable onlineUsersHash=(Hashtable)Application["OnlineUsers"];
onlineUsersHash.Remove(Request.UserHostAddress);
}

这就是一个简单的能实现记录在线用户列表的代码。呵呵,简单吧?你可以传到服务器上去试试!如果你和我一样,看到自己的用户名已经出现在列表中,就欢呼雀跃地告诉许多网友很简单就实现了一个在线用户列表显示功能,然后就关了机器去睡觉了的话,那么第二天清晨你会大吃一惊!你的网站上的在线用户列表中的人名会多的数不清,而且你会知道其实那些人根本就不在线上… 哦,真是个灾难!算法思想没有任何错误,但是却得出错误的结果,为什么呢?虽然是一个小小的功能,但是却隐藏了许多玄机,这个就要看你是否能解开了…
首先我要肯定一点,用Hashtable这样的数据结构来存储在线用户的名称的确是个不错的选择。主键使用用户的IP地址,主键值存放用户名称。因为网络中的IP地址是唯一的,所以用它来充当主键时对的。出现上述错误的原因是在Session_End函数中,Hashtable没有将主键删除掉?!
我想所有初学者都会和我一样,会问:既然IP地址在整个网络中是唯一的,那为什么还无法删除Hashtable中的键呢?答案是:Hashtable没有找到主键名,即用户的IP地址:Request.UserHostAddress!这听起来真是笑话,用户IP地址怎么会找不到呢?只要用户登陆Internet,就必有IP地址!它怎么会找不到呢?
我告诉你,原因是:用户根本就没有登陆Internet!
什么在线,又不在线的?我想你现在应该已经晕了… 不过,看了下面的图例,我想你就明白了…
如果觉得示意图有些小,可以调整显示比例(Word菜单 à 视图 à 显示比例)。

左图是假设一个用户先登录Bincess论坛,而后就去了WadeLau.org(WadeLau.net)这个网站。但是他一直没有断开连接,一直都在Internet上。而当AfritXia.net的服务器结束了用户的Session时,就会调用:

protected void Session_End(Object sender, EventArgs e)
{
Hashtable onlineUsersHash=(Hashtable)Application["OnlineUsers"];
onlineUsersHash.Remove(Request.UserHostAddress);
}

网友(2):

我觉得LZ问的不只是代码方便的.
首先设计的时候你得给用户加一个标志位,比如是在数据库中用户的属性有一条是ONLINE,当字段为1,则为在线,为0,离线.
所以需要显示在线功能的时候只需要一个存储过程,从数据库中读取出Online的标志位为1的即可