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

时间:2009-03-07 11:59:29

标签: c# asp.net global-asax

我正在聊天应用程序中,我使用HashTable将User和Operator作为Key& ChatRoom类的对象作为HashTable的值。主要问题是当用户或操作员关闭浏览器或断开而没有注销时,它会在会话结束时自动注销。

请帮助我解决这个问题,以及如何在这件事上使用Global.asax。

4 个答案:

答案 0 :(得分:25)

您可以使用global.asax的会话结束事件来删除意外断开连接的用户:

void Session_End(Object sender, EventArgs E) {
    // Clean up session resources
}

但请注意,当用户关闭浏览器或连接丢失时,会话不会结束。它在达到会话超时时结束。

答案 1 :(得分:14)

将Global.asax文件添加到您的网站,并在Session_End事件中,从HashTable中删除该用户。

protected void Session_End(Object sender, EventArgs e)
{
    // Remove user from HashTable
}

答案 2 :(得分:7)

当浏览器关闭时,Session_End事件不会触发,当服务器在特定时间内没有收到用户的请求时(默认为20分钟),它会触发)。这意味着如果您使用Session_End删除用户,他们将在关闭浏览器后保持聊天20分钟。

我建议您将最后一个请求的时间保留在用户对象中。这样,您就可以确定用户的活跃程度,以及用户离开聊天的可能性。例如,您可以将任何未执行任何操作的用户显示为非活动状态。

您还可以让聊天应用程序定期轮询服务器(如果您不这样做)。这将更新对象中的最后一个请求时间,并且只要聊天窗口打开,就会保持用户的活动。

您可以使用浏览器中的onunload事件在用户离开页面时向服务器发送注销请求。这当然仅在用户仍具有网络连接时才有效。重新加载页面时也会触发onunload事件,因此您必须跟踪触发事件的原因才能使用它。

答案 3 :(得分:1)

您可以使用始终在客户端上运行的JavaScript并向服务器发送信号,例如“我在这里”。如果没有下一个信号,您可以拨打Leave();。我和AJAX一起使用它。