本帖最后由 bxqybxqy 于 2011-08-01 16:00:21 编辑

解决方案 »

  1.   

    好像要求你的类继承 System.Web.UI.Page 才可以
      

  2.   

    Session["UserInfo"] = us;
    你应该放在Application或者Cahce对象里面,而不是Session。Session是针对当前会话的。Application.Lock();
    ArrayList a;
    if(Application["UserInfo"] == null)
    {
     a = new ArrayList();
     a.Add(us);}
    else
    {
    a = Application["UserInfo"] as ArrayList;
    a.Add(us);}
     Application["UserInfo"] = a;
    Application.UnLock();
      

  3.   

    在webconfig中加
    <sessionState mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424" sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes" cookieless="false" timeout="240" stateNetworkTimeout="14400" />
    试试
      

  4.   

    可以先看下应用程序的生命周期,Application_Start开始事件中session好像还没有被创建吧!
      

  5.   

    不好意思看错了, 我还以为你写到Application_Start事件里了呢。应该是你没有几次page的愿意 取不到HttpContext.Current 当前上下文  你可以调试看看  这个对象应该是空的。
      

  6.   

    回复4#
    我是想用一个新线程去监视用户是不是在线了 不在线 我就清除application 我只是想实现单点登录的,
    可以如果用户不正常退出(直接关闭浏览器), application 里面的值清不了,所以用户想再次登录的时候他会提示已登录// 
    只因为放在session 里 (用户无论是正常退出,还是直接关闭浏览器)session 都会销毁, 这个新线程每10秒 检测一次session 如果session为空, 那我直接清空application 
      

  7.   

    回复8#
    HttpContext.Current.Session["UserInfo"];
    是空的, 但我怎么在cs文件里继承page呢. 我怎么都调不到  
      

  8.   


    一般情况下你是不能坚查Session的,Session只属于当前访问者,
    application 里面的值清不了?
    这是谁告诉你的?你不会在Session_OnEnd里面清除吗?
      

  9.   


    继承page也没有用,没有人访问,是没有Session可言的
      

  10.   

    多谢提醒
    我用Session_OnEnd试试,不过我想用另一个线程去清的话 我现在的问题有没有好的解决办法, [现大大概知道出错的原因了,是因为程序启动的时候还没有创建session呢, 但是话又说回来, 我是在用户登录之后去判断的 理应是已经有session才是]
      Session["UserInfo"] = us;
                    Session["clearsice"] = true;
                    Application["isLogin"] = txtUsername.Text.Trim();
                    MonitorUsers.User_flog(1);
    用户登录后才去调用:  if (HttpContext.Current.Session["userInfo"] != null)//未创建对象的实例
    还望高手指点参考:
    http://topic.csdn.net/u/20091119/10/af6bc1a0-6955-4cfa-b9c5-6271c6d64f6c.html?seed=580189784&r=74720121#r_74720121
      

  11.   


    用户登录之后,也不是凡是HttpContext.Current.Session就有的。你必须从asp.net启动的对页面处理的线程进入,在当前线程上下文环境里才会有。
      

  12.   

    或者这么说吧,假设你现在有两个线程都在执行,一个是执行你的CheckUserIsOnline方法,另一个是执行你的UserLogin方法,后者是从aspx被asp.net调用之后执行的方法,那么只有后者可以访问HttpContext.Current.Session,而前者只能是null。
      

  13.   

    恩,有可能是你说的这样, 但我昨天找的有关文章说是 这两个session是同一个.那我怎么才能在另一个线程里检测出第一个线程中的Session 呢 谢谢
      

  14.   


    你说的那Session_End事件   当用户直接关闭浏览器时 是不会被触发的 只能是session过期时才可以被触
    [这样一来就有问题:  用户直接关闭浏览器,一会他又想登录系统(session还没过期) 系统就会提示,当前账号已登录!]MSDN说的关闭IE时不执行Session_End事件
    你能说下 不能使用另一个线程去清application 或检测当前session 的原因么
      

  15.   

    Session["UserInfo"] 好像取出来不是 UserInfo类型  还要转换吧
      

  16.   


    问题是现在还好像还没创建 session  再说 我那里已经做了非空判断了
    ======================================================================
    有人用以下方法解决了 但是我的程序中  线程在调用MonitorUsers类时 他不先执行下面方法
    protected override void OnLoad(EventArgs e)
      {
      base.OnLoad(e);
      if (System.Web.HttpContext.Current.Session["Islogin"] == null)
      {
      HttpContext.Current.Response.Write("session Is Null");
      }
      else
      {
      HttpContext.Current.Response.Write("session Is NotNull");
      }
      }
    参考:http://topic.csdn.net/u/20091119/10/af6bc1a0-6955-4cfa-b9c5-6271c6d64f6c.html?seed=580189784&r=74720121#r_74720121
      

  17.   

    貌似也行不通, 只因为用session来存 当用户关闭浏览器session会销毁当有会话结束 ,如果用静态类来存的话,用户什么时候结束会话是没法判断的.(我这样认为的,如果有错请指出 )
      

  18.   

    session 只针对当前会话的。
    MSDN说的关闭IE时不执行Session_End事件
    没有人说关闭IE时执行Session_End事件啊??Session_End是在会话超时时触发的,你没有看web.config里面有session的timeout的配置吗?
      

  19.   

    Clobal.asax是全局的,session是某个用户的,肯定取不到,你可以用Application
      

  20.   


    我session的timeout是20分钟,我只是想说明 Session_End实现不了我想要的效果 ,我给你说下我想实现什么效果吧
    ------------------------------------------------------------
    1.当用户admin登录后 其它人就不可以用这个账号登录(一个账号不能重复登录)
    2.在 用户正常退出(点退出按键)或非正常退出(直接关闭浏览器)的情况下,用户刚闭关浏览器(非正常退出)他又想登录的情况下可以正常登录,(系统不提示当前账号已登录)
      

  21.   


    你只能把timeout设置短一些,或者采取Cookie进行结合判断。或者采取ajax去维护登录信息,或者使用长连接实现。只使用Session的话,注意前提,不经过timeout的时间后做不到的。只能等待20分钟再去登录