我正在尝试在我的网络应用程序中获取活动会话ID的列表。
我试图在Global.asax中管理一个列表。 我在触发Session_Start时添加会话ID,并在触发Session_End时删除会话ID。
问题出在用户关闭浏览器或关闭计算机的情况下。 Session_End未被触发,并且列表中仍然存在。
有人知道如何获得清单?
谢谢!
答案 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>
当然,即使你提醒他记录下来,我决定离开页面的用户仍然是你已经尽力了!