以下代码均在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); }
Session是存在服务器端的,在用户请求服务器时,浏览器会通过Cookies传给服务器一个SessionID,asp.net会自动封装传回来的SessionID,从服务器中拿到对应的数据。所以使用Session的时候是离不开请求上下文的。楼主这种做法,定时器执行的时候不知道要取哪个的Session吧,不知道我的这种推测对不对,楼主可以把具体错误发上来看看。
如果楼主的用户数据需要定时刷新,我觉得可以自己做一个缓存,使用用户ID进行标识,定时去统一刷新就好了。
你打的字多,多给你一分。
@沧海一杰: 谢谢大老板
在Session_Timer中没有HttpContext上下文,所有取不到SessionId的。你想想即是能取到sessionId,那么多的sessionId也不知道取哪个呀!