小弟昨天改 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 分钟,不会这么快就超时的。


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


原因:

由于 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
{
    ......
}


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

至此,问题解决