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

14

我正在开发一个聊天应用程序,我使用 HashTable 来包含用户和操作员作为键,并将 ChatRoom 类的对象作为 HashTable 的值。主要问题是,当用户或操作员关闭浏览器或未正常退出时,会在会话结束时自动注销。

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

4个回答

35

您可以使用global.asax的session end事件来删除意外断开连接的用户:

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

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


如果我在Web.config文件中更改会话超时时间,它会生效吗? - ashish bhatt
不,你可以降低会话超时时间,但这会以意想不到的方式影响整个应用程序。也许你可以在聊天应用程序上设置编程控件。例如,如果用户在5分钟内没有采取任何操作,你可以认为他已经断开连接。 - Canavar
2
@ashishbhatt的评论对我来说是正确的。您可以将会话超时时间降低很多(即1分钟),但是然后您必须确保至少连续执行一个无操作AJAX调用作为心跳(或保持活动)。这只是一个技巧,不应扩展到数百万用户。 - usr-local-ΕΨΗΕΛΩΝ

17

添加一个Global.asax文件到你的网站中,在Session_End事件中,从你的哈希表中移除用户。

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

在我的哈希表中包含一个键,该键也包含Session["UserID"]。此会话用于传递Logout(string usrid)方法的参数usrid,在Session_End事件中使用。如果您有任何想法,请帮助我... - ashish bhatt
2
我不明白你的问题。抱歉。 - MartinHN

8
Session_End事件不会在浏览器关闭时触发,它会在用户在一段特定的时间内没有向服务器发送请求时触发(默认为20分钟)。这意味着如果您使用Session_End来移除用户,则他们将在关闭浏览器后停留在聊天中20分钟。
我建议您在用户对象中保留最后请求时间。这样,您可以确定用户活动程度以及用户离开聊天的可能性。例如,您可以将任何连续两分钟未做任何操作的用户标记为非活动状态。
您还可以让聊天应用程序定期轮询服务器(如果您尚未这样做)。这将更新对象中的最后请求时间,并在聊天窗口打开的情况下使用户保持活动状态。
您可以使用浏览器中的onunload事件向服务器发送注销请求,当用户离开页面时。当然,这仅在用户仍具有网络连接时才有效。当您重新加载页面时,onunload事件也会被触发,因此您必须跟踪事件触发的原因才能使用它。

1
谢谢Guffa,如果我使用onunload事件,那么它会调用Leave(),但是主要问题是当我刷新按钮时,它会调用Leave(),我处理了F5、AlterF4、在body上右键单击的情况,但是如何处理所有浏览器中刷新按钮被点击的情况呢?如果有任何想法,请帮助我。 - ashish bhatt

1

您可以使用始终在客户端运行的JavaScript向服务器发送信号,例如“我在这里”。如果下一个信号没有到达,您可以调用Leave();。我使用AJAX来实现这一点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接