以前没考虑这个问题
在一个类 Env 中有一个
static int userid;
记录当前登录的用户编号.发现如果有其它用户连上来后,原来的连接的用户标识也跟着变了.我怀疑是共同用了这一个数据成员.各位是如何解决这种问题的?

解决方案 »

  1.   

    static是保存在服务器端的静态变量/对象,没有附本..用session/cookie/viewstate都可以.
    建议产生一个cookie对象,记录用户重要信息.减少服务器负担.
      

  2.   

    static int userid
    因为是static的,那就应该是在产生第一个类的实例时初始化了,所有类的实例时共享一个static变量的,这就是前面的id会随后面的变化的原因。用session或者做处理后放到url的参数中。
      

  3.   

    viewstate不可以,不能跨页面访问的!
      

  4.   

    static 类型是应用程序级别的,就相当于一个Application
    可以是用Session不算是一个大的Bug
      

  5.   

    如想整个系统改的代码量少一些,可以这样:
    将static int userid;改为:
    int userid
    {
         get{return int.Parse(session["userid"].ToString() );}
         set{session["userid"] = value;}
    }通过这种方式,我想系统的其他代码基本不需要改动,只需将session的释放时间长一些,基本上会没有问题。
      

  6.   

    static就是共用的吧,用session吧
      

  7.   

    放在  session里面 吧 静态变量 总不是太好
      

  8.   

    晕死了,你不知道Static是公享的吗???去掉了吧!不过你要改变一下访问方式了!
      

  9.   

    这个问题一个人在做开发的时候好像可以,不细想,其实要不得,还是感觉改Session的好。
      

  10.   

    三星的问这个问题不太合适吧?static的静态对象是这样的..没有实例的概念..你是内存里的一块.即使有再多的类实例产生,也共享这一个内存对象.
      

  11.   

    关键是我的userid 是保存在 另外一个工程(dll) 中的,有什么办法在
    dll 中取得当前session 标识呢?
      

  12.   

    staitc 概念我了解.
    我本以为微软会把不同的session 用不同的环境隔开.
      

  13.   

    偶也觉得楼主不应该问这个问题
    偶是下面这么处理的,偶还想改成static的呢using System;namespace guestbook
    {
    /// <summary>
    /// admin 的摘要说明。
    /// </summary>
    public class admin:System.Web.UI.Page
    {
    public admin()
    {
    //
    // TODO: 在此处添加构造函数逻辑
    //
    if ( Session["username"] != null && Session["username"].ToString() != "" )
    {
    _username = Session["username"].ToString();
    }
    } /// <summary>
    /// 登陆标志
    /// </summary>
    private string _username; public string username
    {
    get
    {
    return _username;
    }
    set
    {

    }
    } public bool Login(string strUsername, string strPassword)
    {
    if (strUsername == "admin" && strPassword == "admin" )
    {
    _username = strUsername;
    Session["username"] = strUsername;
    return true;
    }
    return false;
    } public bool IsLogin()
    {
    if ( Session["username"] != null && Session["username"].ToString() != "" )
    {
    return true;
    }
    else
    {
    return false;
    }
    } public void Logout()
    {
    Session["username"] = null;
    }
    }
    }
      

  14.   

    楼主可以说具体一点,你的那个userid是用来标志用户身份的,在进程的整个生命周期都存在吗?
      

  15.   

    在一个 ClassLibrary 中有一个方法,如果在这个方法取取得调用这个方法的
    session(或进程吧) 标识?
      

  16.   


     HttpContext.Current.Session()?
      

  17.   

    static的问题
    HttpContext.Current.Session["userid"]
      

  18.   

    实际上项目是这样的.
    表示层 web        winform       mobile
           -------------------------------
    逻辑层1 ClassLibrary1
           -------------------------------
    逻辑层2 ClassLibrary2
           --------------------------------
    数据库在罗辑层1的实现 ClassLibrary1 中有一个类叫 Env 存储一些 登录用户信息
    我希望在代码中任何地方调用Env.CurUser 得到的都是调用发出者的用户标识如果在调用 Env时还要传一个参数类似 sessionID 等标识,太烦了.
      

  19.   

    你的那个类中的变量不是static会怎么样,实例化一个类,如果类的生命周期没有结束,它的那些共有成员应该是可以访问的啊!
      

  20.   

    如果不用 static 是可以,服务器存储所有登录用户标识,我可以用一个
    hash表,把 连接标识(对于web是 sessionid ) 和 登录环境(包括userid)记录进
    去.但有什么办法在所有想到用 "登录环境"的地方不需要显示指定 连接标识?
    我觉得asp.net 应做到让开发者不用考虑这个问题.
      

  21.   

    HttpContext.Current.Session["userid"]
    写在ClassLibrary1
    中就不用每个页面都写了
      

  22.   

    ClassLibrary1
    中调用Session不是一个好方法
      

  23.   

    2个不用的session调用classlibrary 中的一个方法,在这个方法中没有办法找到调用者身份(或是不用的 thread id)?
      

  24.   

    哪位仁兄有空,帮帮兄弟:
    msn
    enjoylinux#hotmail.com
    # -> @
      

  25.   

    to zhanqiangz(闲云野鹤) :
    是地.因为操作中需要不存验证权限.
      

  26.   

    谢谢大家,特别是goody9807() ( 两星(中级)) 问题解决了,我就是想知道这个
    HttpContext.Current.Session 的东东.我只需在 Env.cs 中把原来的 static 改为对实例的调用, 再实现一个
    sessionid -- Env 对象的 map ,就能通过 env.SessionIDLocator -- 一个
    指向 web 中某 cs 的方法(HttpContext.Current.Session) 的代理对象.
    取得 env 对象.那我其它地方的代码只需要把 env. --> evn.currentEvn. 就行了.