你的位置: 首页 > 新闻博客 > 技术博客

如何终止IntraWeb sessions

2023-03-15 07:34:34

965b73d670e67873bea7da5187154953.png

我不时收到 IntraWeb 用户的问题,询问他们如何终止用户会话并避免未使用的会话继续堆积在服务器中,消耗内存和资源。

重要的是要澄清,IntraWeb 有一个线程在后台运行 - 每隔 1 分钟 - 并在会话超时期限过后清理所有未使用的会话。这意味着,例如,如果会话超时设置为 20 分钟,则在最后一次用户交互(或更准确地说是此会话收到的最后一个请求)后的 20 到 21 分钟之间,清理线程将销毁此会话及其拥有的所有内容 - 即所有表单和 UserSession DataModule。

通常,无需担心这一点,除非您的会话超时时间很长,或者服务器非常繁忙,其中可能有数千个并发用户。可以使用不同的策略来限制未使用的会话数:

1-鼓励用户使用注销按钮或链接显式终止应用程序。当用户执行注销过程时,应用程序可以将用户重定向到另一个站点甚至静态页面,调用WebApplication.TerminateAndRedirect()方法。请注意,当重定向到由同一 IntraWeb 应用程序提供的静态页面时,它必须以不会启动另一个会话的方式进行 - 这将有效地使整个注销过程变得无用。这可以使用静态 HTML 页面来完成,甚至更好的是,可以使用可以提供动态内容的内容处理程序来完成。

阿拉伯数字-将短会话超时与 IWForm 的 KeepAlive 属性结合使用。设置为 True 时,IWForm.KeepAlive 属性将生成 ping 服务器的代码,并有效地防止会话因超时而终止。必须在不希望会话过期的每个应用程序窗体中设置 KeepAlive 属性。与其他用户编码的替代方案(例如 IWTimer)相比,其优势在于 KeepAlive 请求非常轻量级,不会锁定会话,并且速度非常快。话虽如此,请不要为此目的使用 IWTimer。这里唯一的潜在问题是,只要用户在浏览器端保持页面处于活动状态,会话就不会过期,无论用户是否与页面交互。有些人 - 包括我自己 - 在他们的浏览器上打开许多页面数天!

3-从今天发布的 IntraWeb 15.2.69 开始,有一种控制会话持续时间的新方法。我们引入了一个名为 OnAsyncPageUnloaded 的新 IWForm 事件。

每当应用程序用户关闭运行应用程序的浏览器选项卡或关闭浏览器本身时,都会触发此事件。请注意,当应用程序切换到另一个表单时,它不会触发 - 即使页面有效地卸载。此处的目的是检测用户何时离开应用程序。以下是我们在Github上发布的PageUnloadedDemo中使用的代码片段:

异步事件处理程序有 2 个参数,如上所示:EventParams,包含所有请求参数和 AIsCurrent 参数的常用字符串列表。AIsCurrent 指示正在关闭的浏览器选项卡是否是用户当前正在使用的选项卡。这可能看起来令人困惑,但想象一下以下场景:

应用程序用户打开您的应用程序并像往常一样与其交互。在某些时候,用户会复制应用程序 URL 并将其粘贴到新的浏览器选项卡中。如果应用程序未配置为为每个用户运行多个会话(通过 SeverController.SessionOptions.UniqueURL 属性),则用户将在 2 个不同的浏览器选项卡中有效地运行同一会话。其中一个(最后一个要更新的)是当前。 上一个选项卡包含一个副本(可能已过时)。

回到代码片段,事件处理程序中的代码测试是否只有一个活动窗体,并调用一个名为 SelfDestruct 的新 Web 应用程序方法。这是方法签名:

如果在最小 aSecs 间隔(顾名思义以秒为单位)后未收到其他请求,则此方法将销毁会话。有效销毁会话的确切时间点取决于清理线程的执行。因此,在实践中,会话将在 aSecs 和 aSecs + 1 分钟之间销毁。如果会话在调用 SelfDestruct() 后收到新请求,则自毁序列将中止。

请注意,在某些情况下,在 OnAsyncPageUnloaded() 事件处理程序中使用 WebApplication.Terminate() 可能无法按预期工作,尤其是在您使用某些重定向切换到另一个表单时。这就是为什么 WebApplication.SelfDestruct() 是终止该事件中会话的正确方法。

就个人而言,我会使用上述所有 3 个 IntraWeb 功能来为 IntraWeb 应用程序用户提供最佳体验。


QQ在线咨询
售前咨询
0531-66900120
售后服务
13287796906
QQ在线咨询
售前咨询
0531-66900120
售后服务
13287796906