【问题标题】:How do I know when a session has ended when sessionState != InProc当 sessionState != InProc 时,我如何知道会话何时结束
【发布时间】:2010-11-05 04:16:26
【问题描述】:

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

如果我的会话状态在 web config 中是 InProc,我可以使用 Session_End 方法来运行这段代码,但如果不是,我该怎么做呢?

【问题讨论】:

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      有一点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。

      【讨论】:

        【解决方案4】:

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

        如果您使用的是 SQL 状态,则只需检查用户 ID。当会话超时时,该行被删除,就是这样。

        如果您使用的是 IIS 状态服务器服务,则没有直接的方法可以在 Session_End 或类似的东西上执行代码。对不起。

        【讨论】:

          猜你喜欢
          • 2019-11-07
          • 1970-01-01
          • 2017-04-19
          • 2011-06-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-01-21
          相关资源
          最近更新 更多