2009-06-23 86 views
1

我想为我的应用程序在单独的进程中拥有会话状态,但我也想在用户会话结束时运行一些代码。 (改变一个状态字符串,表明他们是否在线,并减少在线用户数量。)我怎么知道会话何时结束sessionState!= InProc

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

+0

如果是关于ASP.NET MVC,那么在这里检查http://stackoverflow.com/questions/1490879/detecting-session-expiry-on-asp-net-mvc – 2014-01-10 14:05:47

回答

1

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

如果您使用SQL状态,您可以只检查用户标识。当会话超时时,该行被删除,就是这样。

如果您使用的是IIS状态服务器服务,则没有在Session_End或其他任何类似方法上执行代码的直接方法。抱歉。

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。

0

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

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

你也可以把javascript检查看看浏览器是否关闭,或者如果注销按钮被点击了,等等......然后进行ajax调用手动关闭会话。

1

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