【问题标题】:Determine when a user "leaves" a page/site in ASP.NET?确定用户何时“离开” ASP.NET 中的页面/站点?
【发布时间】:2012-04-02 16:39:18
【问题描述】:

如果有人离开页面,我如何调用数据库存储过程? 例如,我有某种购物车,当人们将商品添加到购物车时,它必须锁定直到保存,但是如果您翻页,商品被保留在数据库中,如何避免呢?如果有人在没有保存的情况下关闭页面,如何使项目不保留? 谢谢

【问题讨论】:

  • 当有人离开页面并使其正常工作时,很难调用代码。
  • 所以用户将商品添加到购物车,如果他们没有保存就离开页面,您想从购物车中删除商品吗?难道你不能等到用户点击保存按钮后再添加项目吗?
  • 问题是这是公司“内部”程序,当一个用户出售物品时,其他人不能出售相同的物品

标签: c# asp.net .net-2.0


【解决方案1】:

免责声明:以下建议解决问题,而不是问题。


我所知道的可靠处理此类事情的唯一方法 - 确保释放长的交叉事务“锁”(或“票证”) - 是使用服务来“定期发布”(或“清除”)项目。

也就是说,无需响应“注销”事件,只需在(初始)1 小时预订后,从购物车中移除(解锁)尚未购买的商品。

考虑在用户执行影响购物车的操作后延长 5 分钟(次要)预订时间,并通知用户某些商品仅在购买完成之前“保留”。 (例如,看看机票购买网站。)

这可以与结合使用根据业务规则检测“页面卸载”或“注销”的其他方法之一。

编码愉快。

【讨论】:

    【解决方案2】:

    您可以在 global.asax 中的 Session_End 上放置一个处理程序,并在那里检查是否释放保留的任何内容。

    【讨论】:

    • 请注意,此事件并非在所有部署方案中都会发生...我不记得确切的详细信息,但这取决于您的应用程序域在 IIS 中的托管方式。
    • 请记住,在某些情况下不会调用 Session_End。这也不包括离开页面的用户,因此项目将保持锁定直到超时。
    • 这个方案的问题是不能保证Session_End被调用。不幸的是,您不能过分依赖 global.asax 中的事件。
    • 我的英语不太好,但我认为在你们所有的cmets中,第一个保存的订单赢了,其他的输了:)
    • 这只是一种可能性。
    【解决方案3】:

    onbeforeUnload

    示例 HTML

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <script language="javascript" type="text/javascript">
            window.onbeforeunload = function (evt) {
                debugger;
                if (confirm('Are you sure to exit')) {
                    document.getElementById('<%=btn.ClientID %>').click();
                }
                else
                    return false;
            }
    
        </script>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:Button ID="btn" runat="server" Text="Click for SP" OnClick="btn_Click" />
        </div>
        </form>
    </body>
    </html>
    

    后面的示例代码

    protected void btn_Click(object sender, EventArgs e)
    {
         //SP Call
    }
    

    为什么要去数据库做中间操作?为什么不在用户按下保存按钮之前将购物车保存在会话中?这可能会导致您的应用程序出现性能问题。您是否可以在每次点击订单时访问数据库?

    【讨论】:

    • 然后使用 Window->Close 或 File->Exit (或崩溃/强制终止浏览器)...是否有效取决于浏览器。
    • 代码在窗口关闭和选项卡关闭时进行测试。
    • (取决于浏览器,不一定是操作系统。)
    • 抱歉,没有得到,我应该对我的代码进行哪些改进?
    • 这是做到这一点的“最佳”方式。请注意,并非所有关闭窗口的事情都会触发该 [非标准] 事件。
    【解决方案4】:

    为什么不尝试长轮询,您可以使用特定于用户的令牌建立连接,一旦连接断开并且在短时间内没有再次建立,您可以将用户归类为离开网站。

    【讨论】:

      猜你喜欢
      • 2013-05-04
      • 2016-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多