惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Cloudbric
Cloudbric
E
Exploit-DB.com RSS Feed
SecWiki News
SecWiki News
Forbes - Security
Forbes - Security
N
News | PayPal Newsroom
S
Security @ Cisco Blogs
Schneier on Security
Schneier on Security
V
V2EX - 技术
S
Secure Thoughts
W
WeLiveSecurity
Google DeepMind News
Google DeepMind News
C
CERT Recently Published Vulnerability Notes
NISL@THU
NISL@THU
S
Securelist
S
Security Archives - TechRepublic
Know Your Adversary
Know Your Adversary
V
Vulnerabilities – Threatpost
Security Latest
Security Latest
Recent Commits to openclaw:main
Recent Commits to openclaw:main
G
GRAHAM CLULEY
H
Hacker News: Front Page
Microsoft Azure Blog
Microsoft Azure Blog
I
Intezer
Google Online Security Blog
Google Online Security Blog
美团技术团队
阮一峰的网络日志
阮一峰的网络日志
T
The Exploit Database - CXSecurity.com
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Webroot Blog
Webroot Blog
Jina AI
Jina AI
Engineering at Meta
Engineering at Meta
P
Proofpoint News Feed
The Cloudflare Blog
I
InfoQ
L
LangChain Blog
U
Unit 42
P
Proofpoint News Feed
S
Schneier on Security
S
Security Affairs
Y
Y Combinator Blog
T
Tenable Blog
N
News and Events Feed by Topic
MyScale Blog
MyScale Blog
量子位
Google DeepMind News
Google DeepMind News
Cyberwarzone
Cyberwarzone
博客园 - 聂微东
D
Darknet – Hacking Tools, Hacker News & Cyber Security
GbyAI
GbyAI
AWS News Blog
AWS News Blog

博客园 - wangyan

[转]程序员需要具备的基本技能 LumaQQ.NET For Visual Studio 2005 代码下载 [转]今天你多态了吗? [转]理解C#值类型与引用类型 C#抽象工厂模式的几种实现方法及比较 在C#中使用钩子:按下Alt+F4时使窗口最小化 ASPNETDB 存储过程(4) 个性化用户配置部分 ASPNETDB 存储过程(3) 角色管理部分 ASPNETDB 存储过程(2) 成员资格管理部分 ASPNETDB 存储过程(1) 基本及杂类 ASPNETDB 表和视图(3) 个性化用户配置、页面个性化设置 表 和视图 ASPNETDB 表和视图(2) 用户成员资格和角色管理 表 ASPNETDB 数据库关系图、表和视图(1) 基本表和独立表 更改login控件对密码安全性的要求 加密解密、信息摘要 Web网站开发设计中常用的技巧 ASP.NET中怎样实现在线人数的显示 ASP.NET在线用户列表精确版——解决用户意外退出在线列表无法及时更新问题 软件架构师之路
统计在线用户列表 for .net WebForm
wangyan · 2007-10-24 · via 博客园 - wangyan

.NET对用户的状态控制采用SESSION(COOKIE也可以,但是无法在服务器端触发SESSIONEND事件,所以这里说到的方法是基于使用SESSION的)

.NET 和 ASP中都可以使用Global.asax 来对SESSION END事件进行程序设置,网上有很多关于使用global.asax结合APPLICATION和SESSION END事件 写的统计在线人数的方法,但是我没找到统计详细的在线用户信息的资料。

因此,我自己用了一个方案来实现,并调试成功。

思路:通过Session_End事件判断哪个(些)用户过期,或则通过用户点击退出删除该用户在列表的信息,然后清除会话。

    首先,需要一个可公用的服务器端的存储对象,例如 SQL,文本,XML文件或则APPLICATION ,为了调试方便我使用的是APPLICATION,在这个存储对象中需要存储一个可所以的字典的对象,例如数组等,这里我使用的是Hashtable ,好处是Hashtable可以通过一个KEY键来索引,可以通过KEY来删除、添加等操作,而且这个KEY不仅仅是数字索引,可以是你设置的任何对象,对用户会话是否过期判断最好就用用户最后的活动时间做索引。

     我在这个Hashtable中设置KEY为用户最后时间,Value设置为用户登陆名,方便显示和超时比对。

    在Global.asax中的 Session_End事件中不支持任何的Request 对象和Response对象,所以不能从客户端读取任何信息,这也是为什么不用COOKIE的原因。

   虽然,调用Session.Abandon()方法也会触发 Session_End 但是用户的Session全部销毁后才会除法Session_End,所以这时候并不能确定是那个用户触发的Session_End。因此,需要把用户的动作分为两类:
1:点击退出 调用Session.Abandon() ;
2:过期超时;

这样,这个程序就分成了两个部分

1、点击退出: 先将APPLICATION中的当前会话的用户的列表信息删除,然后再清除会话。
2、过期超时:这时会触发Session_End事件,在该事件中,比对所有列表内用户信息,判断最后活动时间与当前时间,超时的就删除。

主要核心代码:
Global.asax
==================================================================================
//当应用程序启动的时候在Application中存储一个空的Hashtable对象
protected void Application_Start(Object sender, EventArgs e)
  {
   Hashtable ht = new Hashtable();
   Application["UserName"] = ht;
  }

//当用户会话结束的时候,比对用户最后活动时间和当前时间,判断哪些要删除,超时时间设置为应用程序中相应的会话超时时间
protected void Session_End(Object sender, EventArgs e)
  {
   Hashtable ht = (Hashtable)Application["UserName"];
   foreach(DictionaryEntry item in ht)
   {
    if(DateTime.Parse(item.Key.ToString()).AddSeconds(20)<DateTime.Now)
    {
     ht.Remove(item.Key);
    }
   }
  }

用户登陆、退出及列表显示:
===================================================================================
   //获取存储对象中的Hashtable对象,并获得其存储的在线用户信息列表,并输出到页面
   Hashtable ht = (Hashtable)Application["UserName"];
   string str = "UserList:";
   foreach(DictionaryEntry item in ht)
   {
    str+=","+item.Value;
   }
   Response.Write(str);

   //用户登陆,记录会话状态,并将该用户加入到在线用户信息列表中
   Session["UserName"] = UserName.Text;
   string str = DateTime.Now.ToString();            //用于标识该用户活动时间,在用户的其他动作中需要修改该时间为用户最新活动时间
   Session["key"] = str;
   Hashtable ht=(Hashtable)Application["UserName"];

   ht.Add(str,UserName.Text);

   //当用户通过点击退出清除会话状态时,先在在线列表中删除该用户的信息,然后清除会话状态
   Hashtable ht=(Hashtable)Application["UserName"];
   ht.Remove(Session["key"].ToString());   
   
   Session.Clear();
   Session.Abandon();

以上就是主要方法,方法很简单,并可以有多种处理方式,大致思路就是这样,但是不管哪种具体的处理方式,在线的统计都将很耗服务器资源,没必要的情况下还是不用为妙