如何获取Web应用程序中的活动会话列表?

时间:2012-01-30 10:08:51

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

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

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

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

有人知道如何获得清单?

谢谢!

3 个答案:

答案 0 :(得分:4)

此问题有 no 解决方案可以避免您注意到的复杂情况。除非有一些明确的方式来结束用户的会话 - 并且用户激活它 - 了解会话何时结束的唯一方法是允许它过期。

当会话超时时,

Session_End最终触发。您永远不会看到Session_End被调用的唯一时间是应用程序域本身意外退出的时间。在这种情况下,无论如何,你知道会话的所有都已经死了。

答案 1 :(得分:1)

如果使用SQL Server数据库将会话存储在其中,则通过使用SQL查询获取所需内容,可以更轻松地检索当前处于活动状态的

我说出现,因为像其他人一样,如果使用Session.Abandon()未正确清除会话,会话就会出现问题。如果用户只是关闭浏览器窗口而不注销。这意味着您只能依赖会话的到期日期来确保会话完全结束,无论您将其设置为多长时间。

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

答案 2 :(得分:1)

安德鲁巴伯是对的。还有一件事你可以做:

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

我是这样做的:

<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>

通过将这些脚本添加到母版页(如果是这种情况或在每个页面中),如果用户尝试加载其他页面或关闭浏览器而不注销,则浏览器会提示用户带有消息的模态窗口。 / p>

当然,即使你提醒他记录下来,我决定离开页面的用户仍然是你已经尽力了!

相关问题