asp.net session丢失又回来的问题
原文:http://onewww.net/blog/article.asp?id=97
今天遇到asp.net session丢失了,然后又回来了,session里存储的是用户信息,最后导致每次刷新是不同的用户或是未登录状态。很让人吐血的问题。搞了2天没搞出来,最后重写了验证机制,都放在了cookie里了,session不敢用了。今天发现,问题是由于设置iis6的 应用程序池内的性能内的最大web进程数导致的,由于session默认是存放在web进程里的,进程开多了,导致session不能共享,每次刷新又由不同的进程来处理,所以就导致刷新出来不同的用户,前提是在本机登录过这些用户。解决方法可以用stateserver或者用sqlserver模式来存储session。由于google没搜到类似问题,所以这里拿出来说一下这个让我头痛了2天,最后修改了n多页面的问题。
Session_End不能执行问题最终解释与调试结果
原文:http://www.xrss.cn/Dev/DotNet/200751613289.Html
首先,我写这篇文章是想让一些朋友少走弯路。我经过两天不断测试得回来的结果,也请朋友尊重我,如果你觉得我写的是错的,请尽量去做测试,做测试完后再来评论。
测试环境:VS2003 Windows2003SP2 IIS6.0
因为一个Web项目要用到Session_End来善后,在网上找了Session_End的相关文章,可谓众说纷纭。有的说有BUG;有的说是服务器内部机制锁定不能执行;有的说是SP2补丁的问题;有的提了一些观点,对一些,错一些。经过几天反复调试,得出结论如下:
1.Session.SessionID的变化:可以显式的为一个Session赋值,或者在Global.asax文件中添加Session_OnStart事件来解决。(参考了一些文章,证明这些朋友是正确的)
2.Session_End,Session_OnEnd事件过程不执行? 1.首先声明一点,Session_OnEnd事件在Session自动超时后怎样都不执行,既然这样Session.Abandon我也就没测试了,因为既然自动超时不执行那就没什么价值了。 2.Session_End在Session过期或者Abandon后可以马上执行,不执行绝对是因为你的程序有错误,请仔细检查程序,最好的办法是将要执行的过程放在某个测试页面DEBUG。 3.InProc模式
3.Session_End执行时还可以访问Session的值吗?答案是"可以"。反复测试后,感觉Session_End和WinForm关闭窗口的Closing事件差不多,在未完全运行完该过程时,是可以访问值的。有些朋友看Session_End取字面意以为就是End了,这是错误的。
4.Session_End中不能运行哪些方法? Request,Server.MapPath 其它的暂未发现
Session属性解释
属性 选项 描述 mode 设置将Session信息存储到哪里 Off 设置为不使用Session功能 InProc 设置为将Session存储在进程内,就是ASP中的存储方式,这是默认值。 StateServer 设置为将Session存储在独立的状态服务中。 SQLServer 设置将Session存储在SQL Server中。 可选的属性是: 属性 选项 描述 cookieless 设置客户端的Session信息存储到哪里 ture 使用Cookieless模式 false 使用Cookie模式,这是默认值。 timeout 设置经过多少分钟后服务器自动放弃Session信息。默认为20分钟 stateConnectionString 设置将Session信息存储在状态服务中时使用的服务器名称和端口号,例如:"tcpip=127.0.0.1:42424”。当mode的值是StateServer是,这个属性是必需的。 sqlConnectionString 设置与SQL Server连接时的连接字符串。例如"data source=localhost;Integrated Security=SSPI;Initial Catalog=northwind"。当mode的值是SQLServer时,这个属性是必需的。 stateNetworkTimeout 设置当使用StateServer模式存储Session状态时,经过多少秒空闲后,断开Web服务器与存储状态信息的服务器的TCP/IP连接的。默认值是10秒钟。