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

推荐订阅源

阮一峰的网络日志
阮一峰的网络日志
博客园 - 司徒正美
D
DataBreaches.Net
宝玉的分享
宝玉的分享
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 【当耐特】
人人都是产品经理
人人都是产品经理
博客园 - Franky
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
IT之家
IT之家
博客园 - 三生石上(FineUI控件)
J
Java Code Geeks
腾讯CDC
博客园_首页
The Cloudflare Blog
S
SegmentFault 最新的问题
C
Check Point Blog
美团技术团队
爱范儿
爱范儿
大猫的无限游戏
大猫的无限游戏
Hugging Face - Blog
Hugging Face - Blog
T
The Blog of Author Tim Ferriss
A
About on SuperTechFans
Blog — PlanetScale
Blog — PlanetScale

博客园 - gjung

收藏 Multithreaded COM server problem Python操作IHTMLDocument2用于自动化测试 svn对比文件源码 SQL SERVER LDF日志文件过大的问题 关于网络字节序和主机字节序 经度和纬度 TUXEDO 通讯缓冲区类型 TUXEDO client端示例程序 TUXEDO自带 方便查看 - gjung TUXEDO server端示例程序 TUXEDO自带 方便查看 固定资产减值准备与累计折旧会计核算的关系 固定资产折旧方法 sql server 2005的分页函数ROW_NUMBER 面向接口编程 abstract、virtual及override - gjung - 博客园 抽象类与接口的区别 用bde连接 连接sql server2005 - gjung 网页中的控件编辑状态 从sql2000 复制数据到sql2005
application 和 session区别以及使用application存储在线用户...
gjung · 2009-12-20 · via 博客园 - gjung

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);
                }
            }
        }