用户使用Membership登录后(vs2005自带的登录系统),再使用Session记录一些该用户相关的信息,但是在使用过程中发现只要网页几分钟不操作,Session["user"]经常就变成了null,原来赋值的信息不见了.
还有有时在操作过程当中,session["user"]信息也会莫明其妙的变成null,可能与出现的异常有关???Session时间延时我已经设置了1小时.

解决方案 »

  1.   

    如果你发现网页几分钟不操作就丢失Session数据,那么设置为1小时不但是无病乱投医,而且是投了个庸医,从理论上说你的做法不但无用,如果有效还会损害服务器管理效率。首先你要检查程序用有没有“清除Session项目”这种危险代码。其次看看有没有什么代码修改bin、app_code目录下的文件,以及修改web.config文件。这些代码都是会造成应用程序重启的。如果是自己的服务器,可以使用“状态服务器”来管理Session。当你使用租用的虚拟主机并且也不想使用SQL Server数据库时应该这样,就是放弃使用Session项目来保存状态。在应用程序重启时,Session.SessionID并不改变(因此说Session丢失其实不准确,应该是Session中保存的数据项丢失)。你可以自己使用自己的ORM将内存对象自动保存在数据库中,并且自动从数据库中读出来,当然要定期清除最后一次访问比较久的超时Session所保存的状态值。
      

  2.   

    分层,这是一个工程技术。例如说:public class 登录用户
    {
      public string SessionID;
      string 登录时间;
      string 登录时的验证码;
      uri 登录时的推荐广告;
      guid 数据库中用户id;
    }这个对象你不必存在Session中,可以存在数据库中。因为即使服务器整个机器断电重新启动之后,当客户端访问服务器的时候并不感觉出服务器重启了,Session.SessionID也仍然是原来那个,你的程序只要能在内存中找到这个SessionID对应的“登录用户”类型的对象就行。至于说这个“找到”是从Session、Cache、数据库中找到的,那是ORM层作的事,程序开发不用考虑。
      

  3.   

    我所说的是假设你是在一个比较正规的项目中开发。如果仅仅是搞个短期demo的网站,往往仅仅考虑用户界面,而不考虑比较深入的技术框架。
      

  4.   

    别用session 了,我以前也用 session ,后来改cookie 了
      

  5.   

    从Session到cookie,非常类似于从asp.net到asp一样,如果你原本就是非常简单的根本不需要开发复杂系统,那么你本来就不应该使用复杂的工具;反之如果你需要开发复杂系统,那么那些简单的东西的限制其实很“要命”:例如cookie需要占用网络带宽、容量大小通常根本不敷使用、客户端有可能禁止、不论服务器否够缓冲用都要反序列化、加密解密则更是比反序列化还厉害。如果你的软件将运行在虚拟主机等低水平服务器上,开发一个自定义的Session服务其实是非常有好处的。
      

  6.   

    例如你要把一个“用户”类型的对象保存在Session中,只要这样写就可以了:驾驶员 u=new 驾驶员("张三");
    u.age=19;
    .....
    MySession session=new MySession(Session.SessionID);
    session["user"]=u;
    可见,我所说的“Session服务”是指与asp.net的Session基本上用法完全一样的东西。只是因为asp.net太差劲了,我们需要写出更好的Session。
      

  7.   

    非常感谢,上面这么多高人帮我解答...
    我现在的解决思路是在,在code文件夹里定义了一个类(本来就有这个类,它自定义了用户的各种操作),如果发现Session变空,则再去读取一次,这样应该能解决...
    另外,sp1234所说的状态服务器是不是指viewstate?
    服务器是自己的,有几台,还有数据库,我想用数据库来存不很现实,我本来就是从数据库中调用数据的,或许可以改到缓存当中去?