关于session丢失原因的分析
http://www.weiw.com  2003-3-29  伟网动力

很多session丢失的原因是因为错误的程序或者是错误的虚拟目录结构。

SessionID 的改变有下面几个原因。

原因一:

Netscape的浏览器会认为"/App/user.asp"跟"/app/user.asp"是两个不同的程序
。它会自动地开始一个新的会话期(new session)。所以,才你的网站上一定要统
一字母的大小写。

原因二:

另外一个是原因是 Session.Timeout 的值。

Timeout这个属性是用来设置Session的超时时间的,一分钟为单位。假如一个用
户,在一个Timeout的时间内没有刷新或者请求页面,那么会话就会结束(the se
ssion ends)。当你再次请求页面的时候,一个新的会话有会开始。

确信Timeout的值,是分钟的。

格式: Session.Timeout [ = nMinutes]

原因三:

假如用户把他们的浏览器的cookie关了,当然session就不能保持。因为session
的保持是要靠cookie的。

要保持Session的状态,浏览器就必须支持cookie,而且在打开的状态。
你当然可以用其他的方法

原因四:

常犯的错误就是,建立了错误的目录结构。
像下面的目录结构:
root 放了global.asa
\virtual_root 没有global.asa
\another_virtual_root 没有global.asa

调用两个virtual roots的页面,就会执行相同的global.asa(root上的那个)

另外的一个目录结构:
root 没有global.asa
\virtual 放了global.asa
\another_virtual_root 另外一个global.asa

每一个不同目录下的global.asa都会各自执行,当然执行的代码就不同了。不过
如果里面的代码一样,就令当别说。:)

所以你在请求不同目录下页面,将会导致不同的global.asa被执行。不同的变量
被调用,不同的session id被建立....之前的有用的信息都被
破坏了。

下面是详细的解释:

当你先浏览子虚拟程序上的页面(child virtual application),然后再去浏览子
虚拟程序的上一级的父虚拟程序(parent virtual root)的页面。那些变量就会丢
失、破坏。看下面的表格:

请求 子程序1丢失 子程序2丢失
先请求Root 不会 不会
只在子程序1之前请求Root 不会 会
只在子程序2之前请求Root 会 不会
最后请求Root 会 会

有一个注册表的键值(registry entry),叫CheckForNestedVroots(缺省为 1)。是
设ASP是否去检测其他目录里的global.asa文件。

假如一个页面被请求,但是如果在这个被请求页面的同一目录里没有global.asa
这文件,那么asp就会去上级的目录里找。ASP设计就是这样的。另一方面,假如
application被请求的页面是在root的话,而global.asa也在root,那么ASP就会执
行这个在root上的global.asa文件。没有必要去找子目录下的global.asa文件了

Internet 服务管理器,可以把一个目录设成虚拟的目录,这样的目录是可以拥有
自己的global.asa文件,当然Application_OnStart和Session_OnStart是少不了
的(废话)。

这是个例子。他们都有Global.asa

C:\InetPub\wwwroot <Home>
Global.asa
C:\InetPub\wwwroot\Test2 (Nested)
Global.asa
C:\InetPub\wwwroot\Test2\Test3 (Nested)
Global.asa
C:\InetPub\wwwroot\Test4
Global.asa

注意:

如果Global.asa文件web请求时是要求认证的话,那么在Global.asa文件的Sessi
on_onStart过程里初始化的变量将会是空的。如果你的global.asa的权限真的是
这样设的话,那么将会带来很多的麻烦。例如你会见到这样的错误信息:

Microsoft OLE DB Provider for ODBC Drivers error '80004005
[Microsoft][ODBC Driver Manager] Data source name not found and no def
ault driver specified
/<web name>/<asp filename>.asp, line xx

这就是因为Session_onStart里面初始化的session变量是空的(根本就没有初始化
)。

另外:这个问题在win95上不存在。更准确的是说,像在FAT这样的,没有文件权
限设置的文件系统里,没有这样的问题。所以NT的NTFS是有这样问题的但,win9
5,98的就没有。

所以,你必须为Global.asa文件设置Internet匿名读取的权限,这样才保证问题
不会发生。

Session丢失的解决办法小结

最近在做ASP.NET项目时,测试网站老是取不出Session中的值,在网上搜索了一下,找到一些解决方法,记录在这里。最后使用存储在StateServer中的办法解决了问题。

SessionState 的Timeout),其主要原因有三种

一:有些杀病毒软件会去扫描您的Web.Config文件,那时Session肯定掉,这是微软的说法。
二:程序内部里有让Session掉失的代码,及服务器内存不足产生的。
三:程序有框架页面和跨域情况。

第一种解决办法是:使杀病毒软件屏蔽扫描Web.Config文件(程序运行时自己也不要去编辑它)
第二种是检查代码有无Session.Abandon()之类的。
第三种是在Window服务中将ASP.NET State Service 启动。

下面是帮助中的内容:

(ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpguide/html/cpconsessionstate.htm)
ASP.NET 提供一个简单、易于使用的会话状态模型,您可以使用该模型跨多个 Web 请求存储任意数据和对象。它使用基于字典的、内存中的对象引用(这些对象引用存在于 IIS 进程中)缓存来完成该操作。使用进程内会话状态模式时请考虑下面的限制:

使用进程内会话状态模式时,如果 aspnet_wp.exe 或应用程序域重新启动,则会话状态数据将丢失。这些重新启动通常会在下面的情况中发生: 
在应用程序的 Web.config 文件的 <processModel> 元素中,设置一个导致新进程在条件被满足时启动的属性,例如 memoryLimit。 
修改 Global.asax 或 Web.config 文件。 
更改到 Web 应用程序的 Bin 目录。 
用杀毒软件扫描并修改 Global.asax 文件、Web.config 文件或 Web 应用程序的 Bin 目录下的文件。 
如果在应用程序的 Web.config 文件的 <processModel> 元素中启用了网络园模式,请不要使用进程内会话状态模式。否则将发生随机数据丢失。

还有这二种:

一:在第一个页面置了SESSION,然后REDIRECT去第二个页面。解决方法是在REDIRECT中设置endResponse为FALSE。

二: ASP.NET中使用了ACCESS数据库,而且数据库是放在bin目录中的。解决方法是不要放会更新的文件在BIN目录中。

参考:http://www.dotnet247.com/247reference/msgs/58/290316.aspx

Asp.net 默认配置下,Session莫名丢失的原因及解决办法

正常操作情况下Session会无故丢失。因为程序是在不停的被操作,排除Session超时的可能。另外,Session超时时间被设定成60分钟,不会这么快就超时的。

这次到CSDN上搜了一下帖子,发现好多人在讨论这个问题,然后我又google了一下,发现微软网站上也有类似的内容。

现在我就把原因和解决办法写出来。

原因:

由于Asp.net程序是默认配置,所以Web.Config文件中关于Session的设定如下:
<sessionState mode='InProc' stateConnectionString='tcpip=127.0.0.1:42424' sqlConnectionString='data source=127.0.0.1;Trusted_Connection=yes' cookieless='true' timeout='60'/>

我们会发现sessionState标签中有个属性mode,它可以有3种取值:InProc、StateServer?SQLServer(大小写敏感) 。默认情况下是InProc,也就是将Session保存在进程内(IIS5是aspnet_wp.exe,而IIS6是W3wp.exe),这个进程不稳定,在某些事件发生时,进程会重起,所以造成了存储在该进程内的Session丢失。

哪些情况下该进程会重起呢?微软的一篇文章告诉了我们:

1、配置文件中processModel标签的memoryLimit属性
2、Global.asax或者Web.config文件被更改
3、Bin文件夹中的Web程序(DLL)被修改
4、杀毒软件扫描了一些.config文件。
更多的信息请参考PRB: Session variables are lost intermittently in ASP.NET applications

解决办法:

前面说到的sessionState标签中mode属性可以有三个取值,除了InProc之外,还可以为StateServer、SQLServer。这两种存Session的方法都是进程外的,所以当aspnet_wp.exe重起的时候,不会影响到Session。

现在请将mode设定为StateServer。StateServer是本机的一个服务,可以在系统服务里看到服务名为ASP.NET State Service的服务,默认情况是不启动的。当我们设定mode为StateServer之后,请手工将该服务启动。

这样,我们就能利用本机的StateService来存储Session了,除非电脑重启或者StateService崩掉,否则Session是不会丢的(因Session超时被丢弃是正常的)。

除此之外,我们还可以将Session通过其他电脑的StateService来保存。具体的修改是这样的。同样还在sessionState标签中,有个stateConnectionString='tcpip=127.0.0.1:42424'属性,其中有个ip地址,默认为本机(127.0.0.1),你可以将其改成你所知的运行了StateService服务的电脑IP,这样就可以实现位于不同电脑上的Asp.net程序互通Session了。

如果你有更高的要求,需要在服务期重启时Session也不丢失,可以考虑将mode设定成SQLServer,同样需要修改sqlConnectionString属性。关于使用SQLServer保存Session的操作,请访问这里。

在使用StateServer或者SQLServer存储Session时,所有需要保存到Session的对象除了基本数据类型(默认的数据类型,如int、string等)外,都必须序列化。只需将[Serializable]标签放到要序列化的类前就可以了。
如:

复制C#代码保存代码
[Serializable]
public class MyClass
{
//......
}

具体的序列化相关的知识请参这里。

至此,问题解决。

转载于:https://www.cnblogs.com/glume/archive/2007/04/05/700732.html

关于session丢失原因的分析相关推荐

  1. session丢失原因 java_Session丢失原因与解决方案

    win2003 server下的IIS6默认设置下对每个运行在默认应用池中的工作者进程都会经过20多个小时后自动回收该进程, 造成保存在该进程中的session丢失. 因为Session,Applic ...

  2. ASP.NET Session丢失问题原因及解决方案[转]

    不得不老调重弹 正常操作情况下会有ASP.NET Session丢失的情况出现.因为程序是在不停的被操作,排除Session超时的可能.另外,Session超时时间被设定成60分钟,不会这么快就超时的 ...

  3. 关于asp.net Session丢失问题的总结

    asp中Session的工作原理: asp的Session是具有进程依赖性的.ASP Session状态存于IIS的进程中,也就是inetinfo.exe这个程序.所以当inetinfo.exe进程崩 ...

  4. asp.net Session丢失问题

    首先了解一下asp.net Session的实现 asp.net的Session是基于HttpModule技术做的,HttpModule可以在请求被处理之前,对请求进行状态控制,由于Session本身 ...

  5. [转]ASP.NET 状态服务 及 session丢失问题解决方案总结

    转自[http://blog.csdn.net/high_mount/archive/2007/05/09/1601854.aspx] 最近在开发一ASP.NET2.0系统时,在程序中做删除或创建文件 ...

  6. 案例分析:session丢失及appdomain回收

    原文地址:http://blogs.msdn.com/tess/archive/2006/08/02/asp-net-case-study-lost-session-variables-and-app ...

  7. Frameset导致Cookies和Session丢失的原因及解决办法

    参考资料 1 Frameset导致Cookies和Session丢失的原因及解决办法 http://blog.csdn.net/zl_c/article/details/1742775  2 使用fr ...

  8. https跳转到http session丢失问题

    为什么80%的码农都做不了架构师?>>>    http>https>http session是不会丢失的. 这个就是用户登录时候通过http访问了首页,或者页面,然后点 ...

  9. 网页版支付宝沙箱开发支付成功同步回调session丢失问题与解决办法

    网页版支付宝沙箱开发支付成功同步回调session丢失问题与解决办法 唉,本人小白大学生,自己独自一人做了个网上商城项目 昨天刚刚用了半天时间解决支付宝异步回调session丢失问题,今天就继续为沙箱 ...

最新文章

  1. 移动终端三分天下 何与争峰
  2. Python中的注释
  3. centos mate桌面_CentOS 7安装桌面汇总
  4. 走钢索的人---走出软件作坊:三五个人十来条枪 如何成为开发正规军(十七)...
  5. [笔记]提升R的性能和突破内存限制的技巧
  6. git 本地推送本地仓库到远程
  7. ArcGIS模型操作
  8. Spring框架的本质:3了解一点儿JavaConfig
  9. 格雷希尔GripSeal螺纹接头的规格型号
  10. QtreeView 树形结构
  11. 二十五个软件测试经典面试题
  12. textbox多行文本框_文本框脚本
  13. Spring核心方法 refresh 解析
  14. 项目中 前后台接口 请求项目移植的问题
  15. 国外云盘(如Rapidgator)免费下载姿势详解
  16. MIUI12 for OnePlus 7T 使用钱包app 的尝试
  17. 你长得真帅,咱俩生个孩子吧
  18. 【codeforces 794A】Bank Robbery
  19. 【Coggle 】糖尿病遗传风险检测挑战赛
  20. 黑马程序员 学习日记(二)

热门文章

  1. SAP UI5对mobile touch事件的支持
  2. SAP CRM WebClient UI和CRM Fiori Account里显示Opportunity逻辑
  3. SAP CRM和C4C数据同步的两种方式概述:SAP PI和HCI
  4. 电脑怎么python转行_零基础转行DA系列|一周Python for Data Science入门
  5. php unset 多可以什么_php unset()销毁单个或多个变量
  6. Python的注释方式
  7. 计算机数控系统的软件结构模式,第四章 计算机数控系统(CNC系统)
  8. C语言写300k文件大概多少行,为什么 DELPHI 编译出的程序一般的来说至少都有300k呢?...
  9. 《计算机网络》第10章在线测试,《计算机网络》第07章在线测试
  10. ADI官方源码快速搭建demo工程验证设计的正确性