.net 当sessionState!=默认模式

.net 当sessionState!=默认模式,.net,asp.net,web-config,session-state,.net,Asp.net,Web Config,Session State,我希望将会话状态放在我的应用程序的单独进程中,但我也希望在用户会话结束时运行一些代码。(更改指示是否联机的状态字符串,并减少联机用户数。) 如果我的会话状态在web配置中为InProc,我可以使用session\u End方法运行此代码,但如果不是,我该如何执行此操作?您使用的是SQL状态还是IIS状态服务器服务 如果您使用的是SQL状态,那么只需检查用户ID即可。当会话超时时,该行将被删除,仅此而已 如果您使用的是IIS状态服务器服务,则没有在会话结束或任何类似的情况下直接执行代码的方法。抱歉

我希望将会话状态放在我的应用程序的单独进程中,但我也希望在用户会话结束时运行一些代码。(更改指示是否联机的状态字符串,并减少联机用户数。)


如果我的会话状态在web配置中为InProc,我可以使用session\u End方法运行此代码,但如果不是,我该如何执行此操作?

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

如果您使用的是SQL状态,那么只需检查用户ID即可。当会话超时时,该行将被删除,仅此而已

如果您使用的是IIS状态服务器服务,则没有在会话结束或任何类似的情况下直接执行代码的方法。抱歉。

尝试检测会话何时过期有点困难。通过查询服务器以查看它是否处于活动状态(使用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。如果使用SQL server,则可以修改DeleteExpiredSessions存储过程来完成工作(即减少在线用户)

或者,您可以在每次页面加载时检查会话变量,如果返回null,则会话已结束


您还可以进行javascript检查,查看浏览器是否已关闭,或者是否单击了注销按钮,等等。。。然后进行ajax调用以手动关闭会话。

您不能指定一个事件处理程序,该处理程序将在会话结束时始终运行。有一些近似方法,例如将事件处理程序分配给InProc会话的结束事件(仅当会话正常结束时才会运行),或更改SQL Server会话的DeleteExpiredSessions过程。

如果是关于ASP.NET MVC的,请检查此处