我有一个使用实体模型的asp.net web-forms应用程序。当用户登录时,我们在user_session表中使用timein创建一行。当用户注销时,我们会更新该行并设置超时。
现在问题是,当用户在没有注销的情况下关闭浏览器时,我们如何更新user_session表中的行?
答案 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”秒进行此演示。如果在这段时间内没有活动,则返回默认或主页,我们发送密钥以更新数据库“会话密钥”或任何其他标签。这样我们就可以知道用户或成员的活动。
这对我有用。