问题描述
大家随便建个网站项目,然后随便建个aspx页面.然后在页面中放入以下代码:protectedvoidPage_Load(objectsender,EventArgse){if(!IsPostBack){Session.Timeout=60;}}
然后在页面上放个Button控件:<asp:ButtonID="Button1"runat="server"Text="Button"/>然后对页面进行调试,监控Session.Timeout的值。1,当页面第一次执行的时候Session.Timeout的值由Web.config中配置的默认sessiontimeout值20变为了60,这没有任何问题。2,但是当你点击页面上的Button按钮进行页面回发后,Session.Timeout又变回了Web.config中配置的值20。但是当你在项目中加入Global.asax后,再重复上面的步骤1和2,你会发现步骤2中Session.Timeout的值就保持为60了。经过测试发现是只要Global.asax中有voidSession_Start(objectsender,EventArgse)函数(函数体什么都没有都可以)步骤2中Session.Timeout的值就是60,如果Global.asax中没有voidSession_Start(objectsender,EventArgse)函数步骤2中Session.Timeout的值就是20。按道理来说步骤2的步骤2中Session.Timeout的值应该是60,因为Session的数据是存储在服务器端的,只要用户的Session不过期,那么该用户的Session.Timeout值应该始终为在页面上更改后的值60.出现这样的奇怪问题不知道算不算ASP.NET的一个BUG。经测试上述问题在VS2010即.Net4.0下还是存在。
解决方案
解决方案二:
2个不同的session当然有不同的值啊,每一次请求服务器都会判断客户端有没有返回session的标识,如果有就不再创建,如果没有就创建,然而,你在每一次访问页面的时候并没有对session操作,你可以用firebug监控下客户端的session标识
解决方案三:
引用楼主busydonkey的回复:
大家随便建个网站项目,然后随便建个aspx页面.然后在页面中放入以下代码:C#codeprotectedvoidPage_Load(objectsender,EventArgse){if(!IsPostBack){Session.Timeout=60;//可以在这里加一个session["userName"]="随便",那样效果就出来了}
解决方案四:
引用2楼licai1210的回复:
引用楼主busydonkey的回复:大家随便建个网站项目,然后随便建个aspx页面.然后在页面中放入以下代码:C#codeprotectedvoidPage_Load(objectsender,EventArgse){if(!IsPostBack){Session.Timeout=60;//可以在这里加一个session[……
不是Session值,是针对Session.Timeout这个属性有我说的问这个题,只要在Global.asax中有voidSession_Start(objectsender,EventArgse)这个函数Session.Timeout的值在页面回发后才不会变。这个很奇怪的
解决方案五:
该回复于2012-03-16 11:10:38被版主删除
解决方案六:
解决方案七:
每次加载都会获取webconfig的设置,你写在Global是不是就好了呢
解决方案八:
引用3楼busydonkey的回复:
引用2楼licai1210的回复:引用楼主busydonkey的回复:大家随便建个网站项目,然后随便建个aspx页面.然后在页面中放入以下代码:C#codeprotectedvoidPage_Load(objectsender,EventArgse){if(!IsPostBack){Session.Timeout……
回发后就不是同一个会话了呗
解决方案九:
用了session_start代表你的会话使用了session所以服务器会认为是同一个会话,既然是同一个会话属性的值当然不会改变
解决方案十:
引用8楼licai1210的回复:
用了session_start代表你的会话使用了session所以服务器会认为是同一个会话,既然是同一个会话属性的值当然不会改变
是不是同一个会话不是由session_start函数来决定的吧。并且上面我写了session_start的函数体为空都可以,即什么多不做Session.Timeout的值都会为60。难道将Global.asax中的session_start函数删掉,下次过来的Request就不是同一个session了吗?并且在调试的时候你会发现在点击Button让页面回发的时候session_start函数根本就没被执行的。
解决方案十一:
引用7楼ltcszk的回复:
引用3楼busydonkey的回复:引用2楼licai1210的回复:引用楼主busydonkey的回复:大家随便建个网站项目,然后随便建个aspx页面.然后在页面中放入以下代码:C#codeprotectedvoidPage_Load(objectsender,EventArgse){if(!IsPost……
这不对啊。。。是不是同一个会话不应该是有回发决定啊。。。应该是要不你把浏览器管了重新打开,要不回发的时间间隔超过了Session.Timeout,可上面的实验中我是立即点击Button按钮回发,很明显没有超过Session.Timeout的时间。
解决方案十二:
引用9楼busydonkey的回复:
引用8楼licai1210的回复:用了session_start代表你的会话使用了session所以服务器会认为是同一个会话,既然是同一个会话属性的值当然不会改变是不是同一个会话不是由session_start函数来决定的吧。并且上面我写了session_start的函数体为空都可以,即什么多不做Session.Timeout的值都会为60。难道将Global.asax……
去掉了session_start又在页面没使用session,当然请求是新的
解决方案十三:
引用11楼licai1210的回复:
引用9楼busydonkey的回复:引用8楼licai1210的回复:用了session_start代表你的会话使用了session所以服务器会认为是同一个会话,既然是同一个会话属性的值当然不会改变是不是同一个会话不是由session_start函数来决定的吧。并且上面我写了session_start的函数体为空都可以,即什么多不做Session.Timeo……
额。。。我个人还是认为请求是不是用的新的Session和Global.asax中有没有定义session_start函数无关。