-1

我需要找到一种方法来拦截浏览器关闭并调用一个方法来更新一条记录,其中包含有关数据库中登录用户的一些信息。当用户注销或关闭浏览器时更新此记录非常重要。显然,当用户单击“注销”时,我会在服务器端事件中处理更新,但是如果用户只是退出浏览器呢?

有人建议使用该window.onbeforeunload事件并对某些 WS 或 WebMethod 进行异步调用来执行代码,但这根本无法说服我:问题onbeforeunload在于它显示了确认提示。我需要避免此消息并简单地调用该方法。

所以我想知道是否有不使用 ajax 或 javascript 的“服务器端”解决方案。例如...一种在会话放弃或会话清除时触发某些事件的方法,或其他解决此问题的方法,只是在代码隐藏上工作...

4

6 回答 6

4

你不可能有一个服务器端的解决方案来知道客户端浏览器中发生的事情。

于 2013-03-04T15:19:15.817 回答
1

我不相信有任何方法可以只在服务器端做你需要的事情。客户端是唯一的方法。服务器无法知道浏览器窗口何时关闭,这是 HTTP 协议的限制。

于 2013-03-04T15:19:40.777 回答
0

是的,您可以在 Global.AsaX 中放置一个事件,该事件将在会话结束时触发。现在,如果您需要来自客户端的数据来更新数据库等,您将需要一种获取数据的方法,但如果不需要,那么Session_End就可以了。

注意:会话结束与浏览器关闭略有不同,因此这将取决于您希望事件触发执行的操作。

如何处理 global.asax 中的会话结束?

于 2013-03-04T15:20:59.787 回答
0

我想找到一个不使用 ajax 或 javascript 的“服务器端”解决方案。

我怀疑这个要求是不可能的。

也许您可以执行以下操作:

  1. 在页面上有一个隐藏的 IFRAME
  2. 在此 IFRAME 上设置 Refresh 标头(或使用META元素)以每隔几秒联系一次服务器
  3. 如果您在一段时间内没有收到客户端的消息,则假设浏览器已关闭。

但是,我想这个解决方案不会很好地扩展。

于 2013-03-04T15:21:10.693 回答
0

你有没有考虑过类似信号器的东西?我用它来检测某人何时打开了记录。

public class ChatHub : Hub
{
     public override Task OnDisconnected()
     {
         Broadcaster.Disconnected(Context.ConnectionId);
         return base.OnDisconnected();
     }
}
于 2013-03-07T08:31:43.973 回答
0

目前,我从根本上改变了解决问题的方法。为了更新待处理的行,我使用 Quartz.NET 框架实现了一个定时作业,该作业每晚运行。

于 2013-03-07T08:45:45.720 回答