application 和 session区别
1)、生命周期不同
application 整个应用程序的生命期
session 用户活动时间+一段延迟时间(一般为20分钟)
2)、保存的数据不同
Application 用于保存所有用户的公共的数据信息
session 用于存储单个用户的数据
application存储在线用户的session信息的示列
如果我们用session保存每个用户的登录信息
以下示例将展示将所有用户的登录信息保存到Application中的做法
首先:
我们在Global.asax的Application_Start事件中添加下边的语句:
//在线用户列表
Application["OnlineUsers"] = new Hashtable();
然后:在每个用户登录的时候,执行下边的语句
HttpContext.Current.Session["UpdateTime"] = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
((Hashtable)(HttpContext.Current.Application["OnlineUsers"])).Add(empid, HttpContext.Current.Session)
最后:我们展示用Application实现在线用户检测的功能,就能Application中始终保存在线的用户的Session
1)、在Global.asax的Session_Start事件中添加下边的语句:
// 将会话失效时间设置为5分钟
Session.Timeout =5;
2)、使用js每1分钟调用一次后台的一个web服务,不做任何工作,用于重新开始会话的记时。
同时更新Application中该用户Session的时间戳。
Hashtable s_onlineUsersHash = (Hashtable)(HttpContext.Current.Application["OnlineUsers"]);
System.Web.SessionState.HttpSessionState ses = (System.Web.SessionState.HttpSessionState)(s_onlineUsersHash[empid]);
ses["UpdateTime"] = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
3)、使用js每2分钟调用一次后台的一个web服务,用于清除不活动的用户:
DateTime Now;
Now = DateTime.Now;
TimeSpan ts = new TimeSpan(0, 0, 120);//120秒的时间差
System.Web.SessionState.HttpSessionState ses;
//删除不活动的用户
Hashtable s_onlineUsersHash = (Hashtable)Application["OnlineUsers"];
//将意外结束的用户从列表中去除。
ArrayList hxKey = new ArrayList(s_onlineUsersHash.Keys);
foreach (string s_empid in hxKey)
{
//如果客户端有120秒不提交更新时间戳,则说明客户端已经非正常退出(断电、进程意外结束等),清除session信息。
ses = (System.Web.SessionState.HttpSessionState)(s_onlineUsersHash[s_empid]);
DateTime LastUpdateTime = DateTime.Parse(ses["UpdateTime"].ToString());
if (Now - LastUpdateTime > ts)
{
try
{
((Hashtable)(HttpContext.Current.Application["OnlineUsers"])).Remove(s_empid);
}
catch
{
((Hashtable)(HttpContext.Current.Application["OnlineUsers"])).Remove(s_empid);
}
}
}