首页 新闻 会员 周边

下面的代码为何无法获取SessionID?

0
悬赏园豆:10 [已解决问题] 解决于 2015-11-11 16:11

  以下代码均在Global.asax中定义:

 protected void Session_Start(object sender, EventArgs e)
        {
            var sessionTimer = new System.Threading.Timer(Session_Timer, Session, 1000, 1000); //这里是可以拿到SessionID的,没有异常且值不为空
        }

protected void Session_Timer(object obj)
        {
            var session = (HttpSessionState)obj;
            var sessionID = "";
            try { sessionID = session.SessionID; } catch { }  //这里会引发异常            
Debug.Print("{0}\tSession_Timer SessionID:{1}", DateTime.Now.ToString("yyyy-MM-DD HH:mm:ss") , sessionID); }
问题补充:

我的意图是为每个登录的用户定制一个定时器,定时刷新一些用户数据。请不要讨论这个做法的性能问题,只讨论可行性。

空明流光的主页 空明流光 | 初学一级 | 园豆:106
提问于:2015-11-09 09:54
< >
分享
最佳答案
0

Session是存在服务器端的,在用户请求服务器时,浏览器会通过Cookies传给服务器一个SessionID,asp.net会自动封装传回来的SessionID,从服务器中拿到对应的数据。所以使用Session的时候是离不开请求上下文的。楼主这种做法,定时器执行的时候不知道要取哪个的Session吧,不知道我的这种推测对不对,楼主可以把具体错误发上来看看。

如果楼主的用户数据需要定时刷新,我觉得可以自己做一个缓存,使用用户ID进行标识,定时去统一刷新就好了。

收获园豆:6
于为源 | 小虾三级 |园豆:956 | 2015-11-09 10:39

你打的字多,多给你一分。

空明流光 | 园豆:106 (初学一级) | 2015-11-11 16:11

@沧海一杰: 谢谢大老板

于为源 | 园豆:956 (小虾三级) | 2015-11-11 17:32
其他回答(1)
0

在Session_Timer中没有HttpContext上下文,所有取不到SessionId的。你想想即是能取到sessionId,那么多的sessionId也不知道取哪个呀!

收获园豆:4
junjieok | 园豆:779 (小虾三级) | 2015-11-10 17:43
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册