小弟昨天改
B2BE2E
程序的时候发现
aspx
下的页面
session
传不到下面一个
aspx
页面,甚是不解
找了如下几种
session
丢失的解决办法,供大家参考
但是还是没有找到我的解决方案,经过一夜苦思闵想,今早终于有解
大家要注意哦,郁闷终于解决
最近在做
ASP.NET
项目时,测试网站老是取不出
Session
中的值,在网上搜索了一下,找到一些解决方法,记录在这里。最后使用存储在
StateServer
中的办法解决了问题。
SessionState
的
Timeout)
,其主要原因有三种。
一:有些杀病毒软件会去扫描您的 Web.Config 文件,那时 Session 肯定掉,这是微软的说法。
二 : 程序内部里有让 Session 掉失的代码,及服务器内存不足产生的。
三:程序有框架页面和跨域情况。
第一种解决办法是 : 使杀病毒软件屏蔽扫描 Web.Config 文件 ( 程序运行时自己也不要去编辑它 )
第二种是检查代码有无 Session.Abandon() 之类的。
第三种是在 Window 服务中将 ASP.NET State Service 启动。
一:有些杀病毒软件会去扫描您的 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 进程中)缓存来完成该操作。使用进程内会话状态模式时请考虑下面的限制:
(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> 元素中启用了网络园模式,请不要使用进程内会话状态模式。否则将发生随机数据丢失。
在应用程序的 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
一:在第一个页面置了 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 了一下,发现微软网站上也有类似的内容。
现在我就把原因和解决办法写出来。
这次到 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] 标签放到要序列化的类前就可以了。
如:
[Serializable]
public class MyClass
{
......
}
具体的序列化相关的知识请参 这里 。
至此,问题解决
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1385911