Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.Net-如果浏览器关闭,我们如何更新数据库表中的行_C#_Asp.net_Session - Fatal编程技术网

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

C# ASP.Net-如果浏览器关闭,我们如何更新数据库表中的行,c#,asp.net,session,C#,Asp.net,Session,我有一个asp.net web表单应用程序,它使用实体模型。当用户登录时,我们在用户会话表中创建一行timein。当用户注销时,我们更新该行并设置超时 现在的问题是,当用户关闭浏览器而不注销时,我们如何更新用户会话表中的行?您不能。无法通知服务器客户端已关闭浏览器。最好是在SQL Server上安排一些运行和更新行的作业。您也可以尝试在Global.asax中订阅Session\u End事件,但要小心,因为如果使用进程外会话,可能永远不会触发此事件。在您的Global.asax.cs中,您可以

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


现在的问题是,当用户关闭浏览器而不注销时,我们如何更新用户会话表中的行?

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

在您的Global.asax.cs中,您可以在
Session\u End
事件中对其进行编码。直到会话超时(默认为20分钟)才会发生,但它会发生。您可能希望删除
Application\u Start
和/或
Application\u End
事件(当计算机或web进程崩溃时,应用程序\u End事件不会执行,因此最好使用Application\u Start)上的任何现有记录,以确保在web应用程序加载时重新启动。

简短的回答是:您不能。这就是为什么你不应该做这么愚蠢的事

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


更好的解决方案是每隔一段时间运行一次作业,以清除users online表。不管怎么说,这都解决了问题,但您的作业需要做更多的工作来确定要删除的内容。

我想应该是计划好的作业,它将关闭过期的会话,就像在AspState中一样


您可以查看AspState数据库存储过程
DeleteExpiredSessions
,了解您需要做什么。此过程作业名为
ASPState\u job\u DeleteExpiredSessions
每分钟调用一次以关闭会话。

您可以在Global.asax中使用事件会话结束。 根据您的会话设置,浏览器关闭和服务器上的实际会话超时之间可能存在延迟。

请尝试以下代码

Response.AppendHeader("Refresh", "60; URL=../default.aspx")
在每页的
form\u load
事件中,编写以下代码

Response.AppendHeader("Refresh", "60; URL=../default.aspx")
默认会话超时为20分钟,我在演示中使用“60”秒。如果在这段时间内没有任何活动,那么它将返回默认页面或主页,我们将发送一个密钥来更新数据库“会话密钥”或任何其他标记。这样我们就可能知道用户或成员的活动


这对我有用

那么我们如何实现一个每个用户只允许一个活动会话的系统呢。有什么建议吗?@eFriend,计划的作业将确保清除过时的会话。当然,这可能会在以后发生。因此,如果用户关闭浏览器并再次尝试登录,则在会话超时之前可能无法成功。正如我所说,在服务器上没有可靠的方法可以知道用户关闭了浏览器。我们如何在web表单C#?@eFriend中进行计划作业,我不会在web应用程序中执行类似操作。我会使用数据库作业调度程序。实际上,您在这里有一些有用的内容,所以我将不讨论这些内容;但你的链接是关于会话的;这实际上与这个问题或你的答案无关。工作需要知道哪些会话仍然处于活动状态。可能吗?