C# 如何判断当前页面有几个用户在使用?

luxi0194 2010-08-02 03:37:37
C# 如何判断当前页面有几个用户在使用?

----
登录进来的时候用的是Session。

要判断出来有几个用户打开了该页面,在该页面关闭的时候,怎么判断用户退出了该页面?
...全文
251 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
dk503031240 2011-10-20
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 yanimaziba 的回复:]

不就是统计在线人数的功能吧,简单,给你统计在线人数以及在线人详细信息的代码:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebCon……
[/Quote]
mark下 自己试试看
dk503031240 2011-10-20
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 yanimaziba 的回复:]

不就是统计在线人数的功能吧,简单,给你统计在线人数以及在线人详细信息的代码:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebCon……
[/Quote]
[Quote=引用 23 楼 hucailin 的回复:]
Global.asax

C# code

<%@ Application Language="C#" %>

<script runat="server">
int logincount;
int counthistory;
void Application_Start(object sender, EventArgs e)
{
// 在应……
[/Quote]
dk503031240 2011-10-20
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 yanimaziba 的回复:]

不就是统计在线人数的功能吧,简单,给你统计在线人数以及在线人详细信息的代码:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebCon……
[/Quote]
[Quote=引用 23 楼 hucailin 的回复:]
Global.asax

C# code

<%@ Application Language="C#" %>

<script runat="server">
int logincount;
int counthistory;
void Application_Start(object sender, EventArgs e)
{
// 在应……
[/Quote]
myth_sky 2010-08-03
  • 打赏
  • 举报
回复
哦~~~学习了~~~~~
6111111 2010-08-03
  • 打赏
  • 举报
回复
http是无状态连接,不好实现
zhoubupt 2010-08-03
  • 打赏
  • 举报
回复
恩,就是数据库+session的应用就能搞定
冰凝瞬间1986 2010-08-03
  • 打赏
  • 举报
回复

Global.asax


<%@ Application Language="C#" %>

<script runat="server">
int logincount;
int counthistory;
void Application_Start(object sender, EventArgs e)
{
// 在应用程序启动时运行的代码
logincount = 0;
Application.Add("logincount", logincount);
counthistory = 0;
Application.Add("counthistory", counthistory);



}

void Application_End(object sender, EventArgs e)
{
// 在应用程序关闭时运行的代码

}

void Application_Error(object sender, EventArgs e)
{
// 在出现未处理的错误时运行的代码

}

void Session_Start(object sender, EventArgs e)
{
Application.Lock();
logincount = ((int)Application.Get("logincount")) + 1;
Application.Set("logincount", logincount);
counthistory = ((int)Application.Get("counthistory")) + 1;
Application.Set("counthistory", counthistory);
Application.UnLock();
// 在新会话启动时运行的代码

}

void Session_End(object sender, EventArgs e)
{
Application.Lock();
logincount = ((int)Application.Get("logincount")) - 1;
Application.Set("logincount", logincount);
Application.UnLock();

// 在会话结束时运行的代码。
// 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为
// InProc 时,才会引发 Session_End 事件。如果会话模式设置为 StateServer
// 或 SQLServer,则不会引发该事件。

}

</script>



这个是最常用的代码,也是最简单的
捷哥1999 2010-08-02
  • 打赏
  • 举报
回复
好多方法的。
1、记录数据库,登录时+1,登出时-1
2、记录在全局变量中
machunjie2003 2010-08-02
  • 打赏
  • 举报
回复
这个我女朋友会,我也不会……
Valefish 2010-08-02
  • 打赏
  • 举报
回复
数据库设置,缓存存储,全局变量...方法多样,能实现目的就行吧
happyer_longlong 2010-08-02
  • 打赏
  • 举报
回复
基本上不可能吧,你服务器端把页面发送出去就不管了, 我客户端一直打开这个页面不刷新,算不算在用?
happyrain2010 2010-08-02
  • 打赏
  • 举报
回复
在page_load加上ispostback判断
在里面用viewstate变量来判断多少个人打开了
zhangyanyang 2010-08-02
  • 打赏
  • 举报
回复
打开的时候加1,离开的时候减1,剩下的就是登陆的人数了
jeven_xiao 2010-08-02
  • 打赏
  • 举报
回复
方法二:页面上放个lable
在全局应用程序类文件中编写代码: <%@ Application Language="C#" %><script runat="server"> void Application_Start(object sender, EventArgs e) { // 在应用程序启动时运行的代码 Application["count"] = 0; //创建一个Application变量,命名为count,让其初始值为0。 } void Application_End(object sender, EventArgs e) { // 在应用程序关闭时运行的代码 } void Application_Error(object sender, EventArgs e) { // 在出现未处理的错误时运行的代码 } void Session_Start(object sender, EventArgs e) { // 在新会话启动时运行的代码 Application.Lock(); Application ["count"]=(int)Application ["count"]+1; Application.UnLock(); //当有人打开网站时,将其锁定,给变量count加1,然后解锁。 } void Session_End(object sender, EventArgs e) { // 在会话结束时运行的代码。 // 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为 // InProc 时,才会引发 Session_End 事件。如果会话模式设置为 StateServer // 或 SQLServer,则不会引发该事件。 Application.Lock(); Application["count"] = (int)Application["count"] - 1; Application.UnLock();

然后 :protected void Page_Load(object sender, EventArgs e) { Label1.Text = "当前在线人数:"+Application ["count"].ToString ()+"人。";}


OK了吧
jeven_xiao 2010-08-02
  • 打赏
  • 举报
回复
不就是统计在线人数的功能吧,简单,给你统计在线人数以及在线人详细信息的代码:
using System;
using System.Data;
using System.Configuration;
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;
using System.Text;



/// <summary>
/// rs 的摘要说明
/// </summary>
public class rs
{

private string USERNAME;
private int OFFLINEDIFF;
private int REMOVEDIFF;


public rs(string str)
{
//直接在这里设定、或从配置文件中读取配置参数
///存放用户名的Session名
USERNAME = str;
///多少分钟不活动的用户从在线列表中删除
///u
OFFLINEDIFF = 5;
///多少秒执行一次删除不活动用户
REMOVEDIFF = 10;

if (System.Web.HttpContext.Current.Application["OnlineTalbe"] == null)
{
this.CashTableInit();
}
}

public void CheckOnline()
{
//从Application获取数据表、获取SessionID
DataTable dtOnline;
dtOnline = (DataTable)System.Web.HttpContext.Current.Application["OnlineTalbe"];
string sessionId = System.Web.HttpContext.Current.Session.SessionID.ToString();
System.Web.HttpContext.Current.Response.Write(sessionId);

//数据表中是否有我的记录
DataRow drFind = dtOnline.Rows.Find(sessionId);
if (drFind != null)
{
//有;更新我的状态
drFind["LastActiveTime"] = DateTime.Now;
drFind["UserWhere"] = this.AtWhere;
//用户由访客状态变为了登陆会员、或反之
drFind["VisitorName"] = USERNAME;
drFind["VisitorLevel"] = 1;
}
else
{
//无;加入关于我的在线信息
DataRow drNew = dtOnline.NewRow();
drNew["SessionID"] = sessionId;
drNew["VisitorName"] = USERNAME;
drNew["VisitorLevel"] = 1;
drNew["LastActiveTime"] = DateTime.Now;
drNew["LoginTime"] = DateTime.Now;
drNew["VisitorIP"] = System.Web.HttpContext.Current.Request.UserHostAddress;
drNew["UserWhere"] = this.AtWhere;

dtOnline.Rows.Add(drNew);
}
//如果没有人正在执行删除且离上次删除的时间间隔超过设定值

TimeSpan tsRemove = DateTime.Now - Convert.ToDateTime(GetApplication("LastRemove"));
if (tsRemove.Seconds > REMOVEDIFF && this.GetApplication("Removing").ToString() == "n")
{
//锁定,我正在删除过期用户
System.Web.HttpContext.Current.Application.Lock();
SetApplication("Removing", "y");
System.Web.HttpContext.Current.Application.UnLock();
//不知道Rows.Count是否随循环减少,如果是效率就大于foreach且这里不能使用foreach
for (int i = 0; i < dtOnline.Rows.Count; i++)
{
DataRow drDel = dtOnline.Rows[i];
TimeSpan ts = DateTime.Now - Convert.ToDateTime(drDel["LastActiveTime"]);
if (ts.Minutes > OFFLINEDIFF)
{
dtOnline.Rows.Remove(drDel);
System.Web.HttpContext.Current.Response.Write("好累");
}
}


System.Web.HttpContext.Current.Application.Lock();
SetApplication("Removing", "n");
SetApplication("LastRemove", DateTime.Now.ToString());
System.Web.HttpContext.Current.Application.UnLock();
}

//把被我揉腻完了的数据表放回Application
dtOnline.AcceptChanges();
System.Web.HttpContext.Current.Application.Lock();
System.Web.HttpContext.Current.Application["DataTalbeOnline"] = dtOnline;
System.Web.HttpContext.Current.Application.UnLock();
}
//根据apcname得到对应的值
private string GetApplication(string apcname)
{
return System.Web.HttpContext.Current.Application[apcname].ToString();
}
//给Application赋值
public void SetApplication(string apcname, string apcvalue)
{

System.Web.HttpContext.Current.Application[apcname] = apcvalue;

}
/// <summary>
/// 返回用户当前位置
/// </summary>
private string AtWhere
{
get
{
System.Text.StringBuilder sb = new System.Text.StringBuilder();
sb.Append(System.Web.HttpContext.Current.Request.ServerVariables["url"]);
if (System.Web.HttpContext.Current.Request.ServerVariables["QUERY_STRING"] != String.Empty)
{
sb.Append("?");
sb.Append(System.Web.HttpContext.Current.Request.ServerVariables["QUERY_STRING"]);
}
return sb.ToString();
}
}
/// <summary>
/// 创建表
/// </summary>
public void CashTableInit()
{
DataTable dt = new DataTable("OnlineTalbe"); //创建临时表
dt.Columns.Add("SessionID", typeof(string));
dt.Columns.Add("VisitorName", typeof(string));
dt.Columns.Add("VisitorLevel", typeof(int));
dt.Columns.Add("LastActiveTime", typeof(DateTime));
dt.Columns.Add("LoginTime", typeof(DateTime));
dt.Columns.Add("VisitorIP", typeof(string));
dt.Columns.Add("UserWhere", typeof(string));
dt.Columns["SessionID"].Unique = true;
dt.PrimaryKey = new DataColumn[] { dt.Columns["SessionID"] };

System.Web.HttpContext.Current.Application["OnlineTalbe"] = dt;
System.Web.HttpContext.Current.Application["LastRemove"] = DateTime.Now.ToString();
System.Web.HttpContext.Current.Application["Removing"] = "n";
}
}


每个用户的页面都加上这句

protected void Page_Load(object sender, EventArgs e)
{
Session["aa"] = "vv";//获取用户名
rs asd = new rs(userName);//用用户名初始化
asd.CheckOnline();//每次运行时检查用更新本用户
}

在人数统计页面加上
protected void Page_Load(object sender, EventArgs e)
{
if(Application["OnlineTalbe"]!=null)
{
DataTable dt = (DataTable)Application["OnlineTalbe"];
Response.Write(dt.Rows.Count.ToString());
}
}
Thr21ough 2010-08-02
  • 打赏
  • 举报
回复
session or application
sxldfang 2010-08-02
  • 打赏
  • 举报
回复
Application("online")记录在线人数
deknight 2010-08-02
  • 打赏
  • 举报
回复
global.asa
wuyq11 2010-08-02
  • 打赏
  • 举报
回复
记录用户操作日志,获取在线用户
或第三方统计系统如cnzz
session有过期时间,非法关机或关闭IE不会执行session的退出
llsus 2010-08-02
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 luxi0194 的回复:]
一个网站有很多页面A,b,c,d。。。。。,要判断出哪些用户打开了A页面。。。。,而不是用户是否登录。。。。
[/Quote]

有分别吗?用户登录后,打开页面时,你注册信息中包涵页面信息不就行了。
加载更多回复(7)

110,567

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧