2012-02-06 96 views
3

我试图在用户处于非活动状态或会话结束时(通过不活动或更重要的是,当浏览器关闭时)强行“登录”。 我不想使用任何愚蠢的AJAX解决方案来执行每隔几分钟的“im alive”或浏览器关闭时调用的帖子。访问会话结束?

我的印象是,如果你在Session中存储了一个对象,并且你到达了Session_End事件,那么当它结束时你将无法访问存储在Session中的任何东西。 但是从我做的一些测试中,看起来这可能是您获得访问对象的最后机会。

这是真的吗?它可靠吗?

在这里使用ASP.NET 4.0。

回答

0

用于记录超时您可以使用全局事件在超时时记录。请参阅此链接以了解事件顺序http://www.techrepublic.com/article/working-with-the-aspnet-globalasax-file/5771721

+0

谢谢,但你完全误解了这个问题。我不想使用任何JavaScript计时器,也不是要求在配置 – 2012-02-06 23:11:08

+0

中更改会话/表单身份验证超时属性相关的任何内容。请参阅修订后的答案 – PAULDAWG 2012-02-06 23:13:43

3

通常有两件事完成。

第一个是javascript定时器被添加到客户端,而不是心跳,而是作为提醒。如果他们接近会议结束,那么它只是说“会议即将结束,你还在吗?”如果是这样,那么它会执行“愚蠢”的帖子来确保服务器保持会话进行。这纯粹是为了让你的用户很好。

第二个问题(和你的问题的重点)是你把一些东西放在session_end中以清理会话。可靠?以及当时最多

如果应用程序池被回收,Session_End将不会运行。但是,假设应用程序池是好的,那么会在会话过期时执行。应用程序池可以回收的原因很多,从应用程序崩溃到超出内存使用,仅仅因为自上次重置以来已经有一段时间了。这可以在IIS中配置。

我会信任session_end吗?不,不是100%。当然,我不会在会话对象中放置任何内容,无论如何都要求我相信它。

+0

谢谢克里斯。嗯。我不想使用任何JavaScript黑客或回调。必须尽可能在服务器端完成。有什么方法可以让我在会话中“关闭”用户?我想记录用户注销的时间(除了注销注销之外,当会话结束时)。在后台运行一个脚本来检查每个脚本经常不会告诉您网站上是否存在活动,或者不是用户。 – 2012-02-06 23:15:09

+0

真的,你所能做的只是* hope * session_end实际运行。对于那些不需要的情况,您需要一个清理过程服务器端,将用户标记为已注销。为了支持这一点,您需要记录每次他们在您的网站上执行页面加载或其他操作,以确保您不会记录正在使用该站点的人员。 – NotMe 2012-02-06 23:17:17

+1

谢谢克里斯。我的意思是,从我做的测试 - 我每分钟都会过期。我在会话中存储了一个用户ID。我在网站上玩了一分多钟,并且会话没有结束。当我停止玩耍时,那个分钟符号会弹出,Session_End会踢进来,并且我可以在会话中访问用户ID。然后,我可以做我想在这里(即清理)。但对于那些session_end没有命中的情况,我想我可以每天运行一个SQL作业来更新“loggedOffAt”字段,从登录时间开始+ x分钟。对此有何想法? – 2012-02-06 23:22:38