当sessionState!= InProc时,如何知道会话何时结束?

时间:2009-06-23 13:29:36

标签: .net asp.net web-config session-state

我想在我的应用程序的单独进程中使用会话状态,但我还想在用户的会话结束时运行一些代码。 (更改状态字符串,指示它们是否在线并减少在线用户数。)

如果我的会话状态是Web配置中的InProc,我可以使用Session_End方法来运行此代码,但是如果不这样做我该怎么做?

4 个答案:

答案 0 :(得分:1)

您使用的是SQL状态还是使用IIS状态服务器服务?

如果您正在使用SQL State,则可以只检查userID。当会话超时时,该行将被删除,就是那个。

如果您正在使用IIS状态服务器服务,则没有直接的方法在Session_End或类似的任何内容上执行代码。遗憾。

答案 1 :(得分:1)

尝试检测会话何时到期时,有一点uncertainty principle。通过查询服务器以查看它是否处于活动状态(使用AJAX或类似程序),您实际上是将它保持活动状态,这通常是您想要的完全相反的行为。

我通常通过在页面中嵌入javascript代码来完成此操作。 :

var sessionTimeout = 20; //minutes - set this programmatically server-side based on your configured timout interval
setTimeout('timeoutAlert()', (sessionTimeout + 1) * 1000 * 60); //we add one minute buffer because this is an inaccurate process and we want to make sure they are actually timed out before we attempt to redirect
function timeoutAlert()
{
    alert("Your sesssion has ended, you will now be redirect to the login page.");
    document.location = '/home.aspx';
}

注意这个timeoutAlert()可以修改一些HTML客户端,运行一些AJAX来执行代码服务器端,无论你需要它做什么。如果在呈现页面后对服务器进行任何调用(例如,通过AJAX),则必须小心取消并重置setTimeout。

答案 2 :(得分:1)

您无法分配在会话结束时始终运行的事件处理程序。有近似值,例如将事件处理程序分配给InProc会话的End事件(仅在会话正常结束时才会运行),或者更改SQL Server会话的DeleteExpiredSessions proc。

答案 3 :(得分:0)

如果您使用的是SQL Server,那么您可以修改DeleteExpiredSessions存储过程来完成您的工作(即减少在线用户)。

或者,您可以检查每个页面加载的会话变量,如果它返回null,则会话结束。

您还可以进行javascript检查以查看浏览器是否已关闭,或者如果已单击退出按钮等,则进行ajax调用以手动关闭会话。