浏览器窗口关闭时,Asp.Net会话变量不会被放弃?

时间:2011-01-20 02:41:09

标签: asp.net iis-7 .net-4.0 session-variables

这是一个奇怪的问题,不确定发生了什么。我正在使用IIS7和.net 4.0。

在浏览器关闭后,似乎会阻止会话cookie留在客户端上。另一个奇怪的是,我可以关闭IE并打开FireFox,会话也在那里。那个怎么样?我在想我的环境是如何设置的。我为InProc设置了会话并在IIS中使用了cookie。 IIS7有什么不同?

更新:我正在为我的应用池使用集成模式。我查看了一个使用.net 3.5创建的旧网站,并在Sever2003上运行iis6。我可以登录该站点,它为我创建会话变量。然后我去FireFox并打开同一个站点。它需要我登录(如果存在会话,我的应用程序将带您到您的prfile)。如果我然后关闭IE并重新打开IE,然后返回我的网站,它需要我再次登录。 iis7和我目前的应用程序发生了什么,这很奇怪。我的会话被拉的唯一区别是我在将当前处理程序转换为Page对象时获取变量:(页)HttpContext.Current.Handler

更新:好吧,我想我找到了问题所在,它与将HttpContext.Current.Handler强制转换为当前页面对象有关。我有一个配置文件,我想放置一个属性,所以所有其他类可以引用一个中心点来获取我创建的用户会话对象。 HttpContext.Current.session始终为null,有人建议转换HttpContext.Current.Handler。我创建了一个简单的页面,检查是否已创建会话变量,如果没有创建它。然后我打印出值。当我关闭浏览器时,会话为GONE。所以,这是有效的。我在这条消息中原创的代码实际上是用于后退按钮,但我并不需要感谢Andrew指出这一点。所以我想不清楚为什么从Hnadler中撤出的会话总是可用的,直到我特意清除它为止。

3 个答案:

答案 0 :(得分:3)

会话在指定的不活动量(默认为20分钟)后结束。 Http是无状态的,服务器与离开浏览器的人不同,但不会发出关闭浏览器窗口的人的任何请求。

Session_OnEnd仅针对InProc会话状态触发。 IE和Firefox共享会话的唯一方法是无cookie会话,其中会话ID嵌入在URL中,并且您在浏览器之间复制URL。

答案 1 :(得分:1)

尝试此操作以清除会话:

 HttpContext.Current.Session.Clear();
 HttpContext.Current.Response.Cookies.Clear();

答案 2 :(得分:0)

好吧,我从来没有得到过这方面的答案,但仍然不确定为什么HttpContext.Current.Handler总是持有我的会话。所以,我最终改变了我设置和获取Session变量的方式。感谢所有人看这个。