ASP.Net - 如果浏览器关闭,我们如何更新数据库表中的行

时间:2011-07-19 07:26:07

标签: c# asp.net session

我有一个使用实体模型的asp.net web-forms应用程序。当用户登录时,我们在user_session表中使用timein创建一行。当用户注销时,我们会更新该行并设置超时。

现在问题是,当用户在没有注销的情况下关闭浏览器时,我们如何更新user_session表中的行?

6 个答案:

答案 0 :(得分:4)

你做不到。无法通知服务器客户端已关闭浏览器。您可以做的最好的事情是在运行和更新行的SQL Server上安排一些工作。您也可以尝试在Session_End中订阅Global.asax事件,但要小心,因为如果您使用的是进程外会话,则可能永远不会触发此事件。

答案 1 :(得分:3)

简短的回答是:你做不到。这就是为什么你不应该尝试做这么愚蠢的事情。

答案越长:您必须忍受会话超时的延迟响应。那可能是相当长的一段时间。在Global.asax中有一个名为Session_End的事件,您可以将其挂钩以执行您想要的操作..但是当用户关闭浏览器时它不会显示。它仅在会话结束时触发,默认情况下是在最后一个请求后20分钟。只有当它是一个内存中的会话并且该过程没有崩溃时才会这样。

更好的解决方案是每隔一段时间运行一次作业以清除用户在线表。这无论如何都能解决问题,但需要更多的工作来确定要删除的内容。

答案 2 :(得分:1)

在Global.asax.cs中,您可以在Session_End事件中对其进行编码。直到会话超时(默认为20分钟)才会发生,但会发生。您可能希望删除Application_Start和/或Application_End事件上的任何现有记录(当计算机或Web进程崩溃时,Application_End事件不会执行,以便最好使用Application_Start)以确保您开始Web应用程序加载时新鲜。

答案 3 :(得分:1)

您可以在Global.asax中使用Event Session_End。 浏览器关闭与服务器上的实际会话超时之间可能存在延迟,具体取决于您的会话设置。

答案 4 :(得分:0)

我想应该是预定的工作,它将关闭AspState中的过期会话。

您可以查看AspState数据库存储过程DeleteExpiredSessions以了解您需要执行的操作。名为ASPState_Job_DeleteExpiredSessions的此过程作业每分钟调用一次以关闭会话。

答案 5 :(得分:0)

请尝试以下代码。

在每个页面的form_load事件中,编写以下代码。

Response.AppendHeader("Refresh", "60; URL=../default.aspx")

默认会话超时为20分钟,我使用“60”秒进行此演示。如果在这段时间内没有活动,则返回默认或主页,我们发送密钥以更新数据库“会话密钥”或任何其他标签。这样我们就可以知道用户或成员的活动。

这对我有用。