我正在聊天应用程序中,我使用HashTable将User和Operator作为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事件,因此您必须跟踪触发事件的原因以便使用它.