不知道是不是Session.Timeout的一个BUG

BusyDonkey 2012-03-15 08:13:34
大家随便建个网站项目,然后随便建个aspx页面.

然后在页面中放入以下代码:

protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
Session.Timeout = 60;
}
}


然后在页面上放个Button控件:
<asp:Button ID="Button1" runat="server" Text="Button" />

然后对页面进行调试,监控Session.Timeout的值。

1,当页面第一次执行的时候Session.Timeout的值由Web.config中配置的默认session timeout值20变为了60,这没有任何问题。

2,但是当你点击页面上的Button按钮进行页面回发后,Session.Timeout又变回了Web.config中配置的值20。



但是当你在项目中加入Global.asax后,再重复上面的步骤1和2,你会发现步骤2中Session.Timeout的值就保持为60了。经过测试发现是只要Global.asax中有void Session_Start(object sender, EventArgs e)函数(函数体什么都没有都可以)步骤2中Session.Timeout的值就是60,如果Global.asax中没有void Session_Start(object sender, EventArgs e)函数步骤2中Session.Timeout的值就是20。按道理来说步骤2的步骤2中Session.Timeout的值应该是60,因为Session的数据是存储在服务器端的,只要用户的Session不过期,那么该用户的Session.Timeout值应该始终为在页面上更改后的值60.出现这样的奇怪问题不知道算不算ASP.NET的一个BUG。

经测试上述问题在VS2010即.Net 4.0下还是存在。
...全文
146 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
BusyDonkey 2012-03-16
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 ltcszk 的回复:]

引用 3 楼 busydonkey 的回复:

引用 2 楼 licai1210 的回复:

引用楼主 busydonkey 的回复:
大家随便建个网站项目,然后随便建个aspx页面.

然后在页面中放入以下代码:

C# code


protected void Page_Load(object sender, EventArgs e)
{
if (!IsPost……
[/Quote]

这不对啊。。。是不是同一个会话不应该是有回发决定啊。。。应该是要不你把浏览器管了重新打开,要不回发的时间间隔超过了Session.Timeout,可上面的实验中我是立即点击Button按钮回发,很明显没有超过Session.Timeout的时间。
BusyDonkey 2012-03-16
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 licai1210 的回复:]

用了session_start代表你的会话使用了session所以服务器会认为是同一个会话,既然是同一个会话属性的值当然不会改变
[/Quote]

是不是同一个会话不是由session_start函数来决定的吧。并且上面我写了session_start的函数体为空都可以,即什么多不做Session.Timeout的值都会为60。难道将Global.asax中的session_start函数删掉,下次过来的Request就不是同一个session了吗?
并且在调试的时候你会发现在点击Button让页面回发的时候session_start函数根本就没被执行的。
licai1210 2012-03-16
  • 打赏
  • 举报
回复
用了session_start代表你的会话使用了session所以服务器会认为是同一个会话,既然是同一个会话属性的值当然不会改变
ltcszk 2012-03-16
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 busydonkey 的回复:]

引用 2 楼 licai1210 的回复:

引用楼主 busydonkey 的回复:
大家随便建个网站项目,然后随便建个aspx页面.

然后在页面中放入以下代码:

C# code


protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
Session.Timeout ……
[/Quote]
回发后就不是同一个会话了呗
ccshigenvwa 2012-03-16
  • 打赏
  • 举报
回复
每次加载都会获取webconfig的设置,你写在Global是不是就好了呢
夜色镇歌 2012-03-16
  • 打赏
  • 举报
回复
BusyDonkey 2012-03-16
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 licai1210 的回复:]
引用 9 楼 busydonkey 的回复:
引用 8 楼 licai1210 的回复:

用了session_start代表你的会话使用了session所以服务器会认为是同一个会话,既然是同一个会话属性的值当然不会改变


是不是同一个会话不是由session_start函数来决定的吧。并且上面我写了session_start的函数体为空都可以,即什么多不做Session.Timeo……
[/Quote]

额。。。我个人还是认为请求是不是用的新的Session和Global.asax中有没有定义session_start函数无关。
licai1210 2012-03-16
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 busydonkey 的回复:]
引用 8 楼 licai1210 的回复:

用了session_start代表你的会话使用了session所以服务器会认为是同一个会话,既然是同一个会话属性的值当然不会改变


是不是同一个会话不是由session_start函数来决定的吧。并且上面我写了session_start的函数体为空都可以,即什么多不做Session.Timeout的值都会为60。难道将Global.asax……
[/Quote]
去掉了session_start又在页面没使用session,当然请求是新的
BusyDonkey 2012-03-15
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 licai1210 的回复:]

引用楼主 busydonkey 的回复:
大家随便建个网站项目,然后随便建个aspx页面.

然后在页面中放入以下代码:

C# code


protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
Session.Timeout = 60;
//可以在这里加一个session[……
[/Quote]

不是Session值,是针对Session.Timeout这个属性有我说的问这个题,只要在Global.asax中有void Session_Start(object sender, EventArgs e)这个函数Session.Timeout的值在页面回发后才不会变。
这个很奇怪的
licai1210 2012-03-15
  • 打赏
  • 举报
回复
[Quote=引用楼主 busydonkey 的回复:]
大家随便建个网站项目,然后随便建个aspx页面.

然后在页面中放入以下代码:

C# code


protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
Session.Timeout = 60;
//可以在这里加一个session["userName"]="随便",那样效果就出来了
}[/Quote]
licai1210 2012-03-15
  • 打赏
  • 举报
回复
2个不同的session当然有不同的值啊,每一次请求服务器都会判断客户端有没有返回session的标识,如果有就不再创建,如果没有就创建,然而,你在每一次访问页面的时候并没有对session操作,你可以用firebug监控下客户端的session标识

62,039

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧