我在聊天应用程序中工作,我使用 HashTable 来包含用户和操作员作为 ChatRoom 类的键和对象作为 HashTable 的值。主要问题是当用户或操作员关闭浏览器或在未注销的情况下断开连接时,它会在会话结束时自动注销。
请帮助我解决这个问题以及如何在这件事上使用 Global.asax。
我在聊天应用程序中工作,我使用 HashTable 来包含用户和操作员作为 ChatRoom 类的键和对象作为 HashTable 的值。主要问题是当用户或操作员关闭浏览器或在未注销的情况下断开连接时,它会在会话结束时自动注销。
请帮助我解决这个问题以及如何在这件事上使用 Global.asax。
您可以使用 global.asax 的会话结束事件来删除意外断开的用户:
void Session_End(Object sender, EventArgs E) {
// Clean up session resources
}
但请注意,当用户关闭浏览器或连接丢失时,会话不会结束。当会话超时时结束。
将 Global.asax 文件添加到您的网站,然后在 Session_End 事件中,将用户从 HashTable 中删除。
protected void Session_End(Object sender, EventArgs e)
{
// Remove user from HashTable
}
Session_End 事件在浏览器关闭时不会触发,它会在服务器在特定时间段(默认为 20 分钟)内没有收到用户的请求时触发。这意味着如果您使用 Session_End 删除用户,他们将在关闭浏览器后继续聊天 20 分钟。
我建议您将最后一次请求的时间保留在用户对象中。通过这种方式,您可以确定用户的活跃程度,以及用户离开聊天的可能性有多大。例如,您可以将任何两分钟内没有做任何事情的用户显示为非活动用户。
您还可以让聊天应用程序定期轮询服务器(如果您还没有这样做的话)。这将更新对象中的最后一次请求时间,并在聊天窗口打开时让用户保持活动状态。
当用户离开页面时,您可以使用浏览器中的 onunload 事件向服务器发送注销请求。这当然只有在用户仍然有网络连接的情况下才有效。当您重新加载页面时也会触发 onunload 事件,因此您必须跟踪触发事件的原因才能使用它。
您可以使用始终在客户端上运行的 JavaScript 向服务器发送信号 - 例如“我在这里”。如果下一个信号没有出现,您可以调用Leave();
。我使用 AJAX 来做到这一点。