【问题标题】:How to get a list of active sessions in a web application?如何获取 Web 应用程序中的活动会话列表?
【发布时间】:2012-01-30 10:08:50
【问题描述】:

我正在尝试在我的 Web 应用程序中获取活动会话 ID 的列表。

我试图在 Global.asax 中管理一个列表。 我在触发 Session_Start 时添加会话 ID,并在触发 Session_End 时删除会话 ID。

问题出在用户关闭浏览器或关闭计算机的情况下。 Session_End 没有被触发,并且列表中仍然存在 Seesion。

有人知道如何获取列表吗?

谢谢!

【问题讨论】:

  • M4N - 我看到了这篇文章,但其中建议的解决方案并不能解决我的问题 - 用户可以关闭浏览器,但会话仍然存在。无论如何谢谢:)
  • @Inbal 那是因为没有解决办法

标签: c# asp.net session global-asax


【解决方案1】:

这个问题没有解决方案可以避免您注意到的并发症。除非有一些明确的方法可以结束用户的会话 - 并且用户激活它 - 知道会话何时结束的唯一方法是让它过期。

Session_End最终在会话超时时触发。您从未看到Session_End 调用的唯一一次是应用程序域本身意外退出时。在这种情况下,无论如何,您知道 所有 会话都已失效。

【讨论】:

    【解决方案2】:

    安德鲁·巴伯是正确的。您还可以做一件事:

    • 要求您的用户注销。事实上,不仅仅是询问他们,而是以某种方式强制/提醒他们必须退出。

    我是这样做的:

    <script type="text/javascript">
        $(function () {
            $("a").click(function () {
                window.onbeforeunload = null;
            });
        }); 
    </script>
    
    <script type="text/javascript">
        window.onbeforeunload = confirmExit;
        function preConfirm() {
            if ((window.event.clientX < 0) || (window.event.clientY < 0)) {
                confirmExit();
            }
        }
        function confirmExit() {
            return "You have attempted to leave this page.  It is suggested to log out using the link.  Are you sure you want to exit this page?";
        }
    </script>
    

    通过将这些脚本添加到您的母版页(如果是这种情况或在每个页面中),如果用户尝试加载另一个页面或在不注销的情况下关闭浏览器,浏览器会通过模式窗口提示用户并显示您的消息。

    当然,即使你提醒他注销用户我还是决定离开页面,但真的你已经尽力了!

    【讨论】:

      【解决方案3】:

      如果您使用 SQL Server 数据库来存储您的会话,那么通过使用 SQL 查询来获取您需要的内容,可以更轻松地检索看起来当前处于活动状态的内容。

      我说 出现 因为就像其他人已经指出的那样,如果没有使用 Session.Abandon() 正确清除会话,会话可能会挂起,例如如果用户只是关闭他们的浏览器窗口而不注销。这意味着您只能依靠会话的到期日期来确保会话完全结束,无论您设置了多长时间。

      我还应该指出,如果您确实使用数据库作为会话存储,Session_End 事件将永远不会触发。

      【讨论】:

        猜你喜欢
        • 2019-06-11
        • 2016-10-29
        • 1970-01-01
        • 2012-02-09
        • 2016-10-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-27
        相关资源
        最近更新 更多