Session丢失问题总结

小弟昨天改 B2BE2E 程序的时候发现 aspx 下的页面 session 传不到下面一个 aspx 页面,甚是不解
找了如下几种 session 丢失的解决办法,供大家参考
      但是还是没有找到我的解决方案,经过一夜苦思闵想,今早终于有解
      Session 传播的时候 http://dtskm http://10.91.50.29 这两个前缀,我们看起来一样
假如 http://dtskm/a.aspx 传到 http://10.91.50.29/b.aspx 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] 标签放到要序列化的类前就可以了。
如:
[Serializable]
public class MyClass
{
    ......
}
具体的序列化相关的知识请参 这里

至此,问题解决
 

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1385911
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值