小弟昨天改 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
{
......
}
具体的序列化相关的知识请参
这里
。
至此,问题解决