基于ASP.net的Session值丢失的原因及解决方法

来源:互联网 发布:日亚什么时候打折 知乎 编辑:程序博客网 时间:2024/05/16 09:53
基于ASP.net的Session值丢失的原因及解决方法     

  [摘要]基于ASP.net平台介绍session的相关知识。首先介绍Session的基本概念、作用及工作过程,然后总结几种常见的造成Session值丢失的原因,并给出相应的解决思路。
  [关键词]Session丢失解决方法
  中图分类号:TP3文献标识码:A文章编号:1671-7597(2009)1120066-01
  


  Session对象的主要用途是保存信息。当一个用户第一次登录网站时,系统会为其分配一个Session,只有当该客户退出时,或者Session生命周期结束时,信息才会被清除。利用Session还可以创建虚拟购物车,当客户在网络商店中选择一种商品时,该商品就会进入到购物车里面,客户的购物信息就会保存在Session中。
  
  一、Session是什么
  
  Session是指一个终端用户与交互系统进行通信的时间间隔,通常指从注册进入系统到注销退出系统之间所经过的时间。具体到web中的Session指的就是用户在浏览某个网站时,从进入网站到浏览器关闭所经过的这段时间,也就是用户浏览这个网站所花费的时间。因此,从上述的定义中我们就可以看到,Session实际上是一个特定的时间概念。一个Session
  的概念需要包括特定的客户端、特定的服务器端,以及不中断的操作时间。A用户和C服务器建立连接时所处的Session,同B用户和C服务器中建立连接时所处的Session是两个不同的Session。
  
  二、Session的作用
  
  Session在WEB技术中占有非常重要的作用。由于网页是一种无状态的连接程序,因此你无法得知用户的浏览状态。因此我们必须通过Session记录用户的有关信息,以供用户再次以此身份对web服务器提供要求时作确认。Session的典型应用是存放用户的Login信息,如用户名,密码,权限角色等信息,应用程序(如Email服务、网上银行等系统)根据这些信息进行身份验证和权限验证。
  
  三、Session的工作过程
  
  当用户第一次访问这个网站时,服务器自动会给这个用户分配一个SessionID号,浏览器只要支持Session,就会根据Session的协议,每次访问网站时都发送这个SessionID给服务器,服务器就知道原来这次http请求还是上次那个用户发的,因为http协议是没有状态的协议,而有了SessionID补充,就识别了用户。当用户在WEB应用程序中间跳转时,存储在Session对象中的变量不会清除,而会始终存在。Session变量相当于运行在客户端多个页面间的全局变量,当用户请求来自应用程序的WEB页时,如果该用户还没有会话,则WEB服务器将自动创建一个Session对象。当会话过期或被放弃后,服务器将终止该会话,如果WEB服务器停止工作,Session也将被释放。
  
  四、Session值丢失的可能原因及解决方法
  
  1.有些杀病毒软件会去扫描Web.Config文件,那时Session肯定会丢失。解决方法是:使杀病毒软件屏蔽扫描Web.Config文件。
  2.程序内部里有让Session丢失的代码。解决方法是:检查是否有Session.Abandon()之类的代码。
  3.程序有框架页面和跨域情况。解决方法是:在Window服务中将ASP.
  NET State Service 启动。
  4.在默认情况下,Session是保存在进程内的,IIS5是aspnet_wp.exe,
  而IIS6是W3wp.exe,该进程不稳定,在某些事件发生时,进程会重起,所以造成了存储在该进程内的Session丢失。引起进程重起可能有以下几种情况:(1)配置文件中processModel标签的memoryLimit属性。(2)Global.asax或者Web.config文件被更改。(3)Bin文件夹中的Web程序(DLL)被修改。(4)杀毒软件扫描了一些.config文件。
  5.文件夹选项中,如果没有打开“在单独的进程中打开文件夹窗口”,一旦新建一个窗口,系统可能认为是新的Session会话,而无法访问原来的Session,所以需要打开该选项,否则会导致Session丢失。
  6.大部分的Session丢失是客户端引起的,所以要从客户端入手,看看cookie有没有打开,或者IE中的cookie数量限制也可能导致Session的丢失。
  
  五、解决Session丢失的其他方法
  
  1.做Session读写日志,每次读写Session都要记录下来,并且要记录SessionID、Session值、所在页面、当前函数、函数中的第几次Session操作,通过这样的途径查找丢失的原因会方便很多。
  2.如果允许的话,建议使用state server或sql server保存Session,
  这样不容易丢失。
  3.在global.asax中加入代码,记录Session的创建时间和结束时间,超时造成的Session丢失是可以在SessionEnd中记录下来的。
  4.如果有些代码中使用客户端脚本,如javascript维护Session状态,就要尝试调试脚本,是否是由于脚本的错误而引起了Session的丢失。
  5.在用ASP.net开发程序的时候遇到Session丢失时,可以完成以下三步,便可保存状态。step1:在WEB.CONFIG文件中修改Session状态保存模式,如:。step2:启动系统服务“ASP.NET状态服务”,系统默认是手动启动的。step3:如果Session中保存的数据类型是自定义的,如结构,则先在自定义数据类型处序列化会话状态,即在类或结构申明前加[Serializable]。
  
  六、结束语
  
  Session的作用不言而喻,在实际操作和网站开发建设中,造成Session值丢失的原因很多,这就需要我们不断发现去总结错误产生的原因,找到解决的方法。
  
  参考文献:
  [1]邵良杉等,ASP.NET(C#)[M].北京:清华大学出版社,2007:192-193.

原创粉丝点击