在线人数统计 asp.net session 在 mode="StateServer" 怎么实现在线统计。因为这个模式不执行Session_End事件 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 Session退出时实现人数统计不准确。非法关机或关闭IE不会执行要记录用户日志和操作时间,再用定时器刷新计算用户已经有固定时间没有活动的用户,然后删除 /// <summary>/// OnLine 的摘要说明/// </summary>public class OnLine{ private int OFFLINEDIFF; private int REMOVEDIFF; public OnLine() { ///多少分钟不活动的用户从在线列表中删除 OFFLINEDIFF = 5; ///多少秒执行一次删除不活动用户 REMOVEDIFF = 30; if (System.Web.HttpContext.Current.Application["DataTalbeOnline"] == null) { this.CashTableInit(); } } public void CheckOnline(string UserId,string UserName) { //从Application获取数据表、获取UserId DataTable dtOnline; dtOnline = (DataTable)System.Web.HttpContext.Current.Application["DataTalbeOnline"]; //数据表中是否有我的记录 DataRow drFind = dtOnline.Rows.Find(UserId); if (drFind != null) { drFind["LastActiveTime"] = DateTime.Now; } else { DataRow drNew = dtOnline.NewRow(); drNew["UserId"] = UserId; drNew["UserName"] = UserName; drNew["LastActiveTime"] = DateTime.Now; drNew["LoginTime"] = DateTime.Now; 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); } } //我删完了,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(); } private string GetApplication(string apcname) { return System.Web.HttpContext.Current.Application[apcname].ToString(); } public void SetApplication(string apcname, string apcvalue) { System.Web.HttpContext.Current.Application[apcname] = apcvalue; } /// <summary> /// 创建表 /// </summary> public void CashTableInit() { DataTable dt = new DataTable("OnlineTalbe"); dt.Columns.Add("UserId", typeof(string)); dt.Columns.Add("UserName", typeof(string)); dt.Columns.Add("LastActiveTime", typeof(DateTime)); dt.Columns.Add("LoginTime", typeof(DateTime)); dt.Columns["UserId"].Unique = true; dt.PrimaryKey = new DataColumn[] { dt.Columns["UserId"] }; System.Web.HttpContext.Current.Application["DataTalbeOnline"] = dt; System.Web.HttpContext.Current.Application["LastRemove"] = DateTime.Now.ToString(); System.Web.HttpContext.Current.Application["Removing"] = "n"; }} 只是用DataTable做一个存储体,不保存记录的~ DataTable dt = (DataTable)System.Web.HttpContext.Current.Application["DataTalbeOnline"]; Application["counter"].ToString () 先定义一个global.asax<%@ Application Language="C#" %><script runat="server"> void Application_Start(object sender, EventArgs e) { // 在应用程序启动时运行的代码 Application["YZTonline"] = 0; } void Application_End(object sender, EventArgs e) { // 在应用程序关闭时运行的代码 } void Application_Error(object sender, EventArgs e) { // 在出现未处理的错误时运行的代码 } void Session_Start(object sender, EventArgs e) { // 在新会话启动时运行的代码 Session.Timeout = 5; //设置Session的有效时间,可根据需要修改 Application.Lock(); Application["YZTonline"] = Convert.ToInt32(Application["YZTonline"]) + 1; Application.UnLock(); } void Session_End(object sender, EventArgs e) { // 在会话结束时运行的代码。 // 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为 // InProc 时,才会引发 Session_End 事件。如果会话模式设置为 StateServer // 或 SQLServer,则不会引发该事件。 Application.Lock(); Application["YZTonline"] = Convert.ToInt32(Application["YZTonline"]) - 1; Application.UnLock(); } </script> 调用页面当前线人<span class="STYLE5"><%=Application["YZTonline"]%></span>人 我的就是用的这个,可是我的session model="StateServer" 是不执行Session_End(object sender, EventArgs e) 事件 我的就是用的这个,可是 我的session mode="StateServer" 是不执行Session_End(object sender, EventArgs e) 事件 换个session mode看看,楼主好像不是用传统方法啊 顶下·· application保存状态· 在BasePage或每个页中加入(new OnLine()).CheckOnline()即可。要获得数据表使用DataTable dt = (DataTable)Application["DataTalbeOnline"] 显示人数的页面:(new OnLine()).CheckOnline();DataTable dt = (DataTable)Application["OnlineTalbe"];Label1.Text="总共"+(dt.Rows.Count).ToString()+"人在线"; (new OnLine()).CheckOnline(); 这里面的参数是什么。 public void CheckOnline(string UserId, string UserName) 当用户 关闭页面之后 执行SESSION.ABANDON()就会强制调用 Session_End() 大家讨论一下论坛救生圈的实现.. 用户控件委托事件 求一个货币验证的正则表达式.小数位不限 FLASH显示时候为什么要刷新才显示,在线等 以XML方式上传数据,服务接收后怎么判断每条记录的状态? 水晶报表不能打印,导出成Word后就可以打印了 关于动态改变CSS样式表文件的问题? 100分:问一个初级问题 对象引用和变量是一样的吗? 编写一个只能输入数字的 自定义控件~!?(菜鸟学习) asp.net插入视频的问题 请教C#如何读取文件夹下多个文件
要记录用户日志和操作时间,再用定时器刷新计算用户
已经有固定时间没有活动的用户,然后删除
/// OnLine 的摘要说明
/// </summary>
public class OnLine
{
private int OFFLINEDIFF;
private int REMOVEDIFF;
public OnLine()
{
///多少分钟不活动的用户从在线列表中删除
OFFLINEDIFF = 5;
///多少秒执行一次删除不活动用户
REMOVEDIFF = 30; if (System.Web.HttpContext.Current.Application["DataTalbeOnline"] == null)
{
this.CashTableInit();
}
} public void CheckOnline(string UserId,string UserName)
{
//从Application获取数据表、获取UserId
DataTable dtOnline;
dtOnline = (DataTable)System.Web.HttpContext.Current.Application["DataTalbeOnline"]; //数据表中是否有我的记录
DataRow drFind = dtOnline.Rows.Find(UserId);
if (drFind != null)
{
drFind["LastActiveTime"] = DateTime.Now;
}
else
{
DataRow drNew = dtOnline.NewRow();
drNew["UserId"] = UserId;
drNew["UserName"] = UserName;
drNew["LastActiveTime"] = DateTime.Now;
drNew["LoginTime"] = DateTime.Now; 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);
}
} //我删完了,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();
}
private string GetApplication(string apcname)
{
return System.Web.HttpContext.Current.Application[apcname].ToString();
}
public void SetApplication(string apcname, string apcvalue)
{
System.Web.HttpContext.Current.Application[apcname] = apcvalue;
}
/// <summary>
/// 创建表
/// </summary>
public void CashTableInit()
{
DataTable dt = new DataTable("OnlineTalbe");
dt.Columns.Add("UserId", typeof(string));
dt.Columns.Add("UserName", typeof(string));
dt.Columns.Add("LastActiveTime", typeof(DateTime));
dt.Columns.Add("LoginTime", typeof(DateTime));
dt.Columns["UserId"].Unique = true;
dt.PrimaryKey = new DataColumn[] { dt.Columns["UserId"] }; System.Web.HttpContext.Current.Application["DataTalbeOnline"] = dt;
System.Web.HttpContext.Current.Application["LastRemove"] = DateTime.Now.ToString();
System.Web.HttpContext.Current.Application["Removing"] = "n";
}
}
<%@ Application Language="C#" %><script runat="server"> void Application_Start(object sender, EventArgs e)
{
// 在应用程序启动时运行的代码
Application["YZTonline"] = 0;
}
void Application_End(object sender, EventArgs e)
{
// 在应用程序关闭时运行的代码 }
void Application_Error(object sender, EventArgs e)
{
// 在出现未处理的错误时运行的代码 } void Session_Start(object sender, EventArgs e)
{
// 在新会话启动时运行的代码
Session.Timeout = 5; //设置Session的有效时间,可根据需要修改
Application.Lock();
Application["YZTonline"] = Convert.ToInt32(Application["YZTonline"]) + 1;
Application.UnLock(); } void Session_End(object sender, EventArgs e)
{
// 在会话结束时运行的代码。
// 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为
// InProc 时,才会引发 Session_End 事件。如果会话模式设置为 StateServer
// 或 SQLServer,则不会引发该事件。
Application.Lock();
Application["YZTonline"] = Convert.ToInt32(Application["YZTonline"]) - 1;
Application.UnLock();
}
</script>
我的session model="StateServer" 是不执行Session_End(object sender, EventArgs e)
事件
我的session mode="StateServer" 是不执行Session_End(object sender, EventArgs e)
事件
顶下·· application保存状态·
DataTable dt = (DataTable)Application["OnlineTalbe"];
Label1.Text="总共"+(dt.Rows.Count).ToString()+"人在线";
(new OnLine()).CheckOnline(); 这里面的参数是什么。
public void CheckOnline(string UserId, string UserName)