【问题标题】:Managing session timeouts in ASP.NET在 ASP.NET 中管理会话超时
【发布时间】:2011-01-18 00:01:00
【问题描述】:

我有一个 ASP.NET 2.0 Web 应用程序与多个 ASP.NET 2.0 Web 服务通信。两者都使用 ASP.NET Sessions 来持久化会话数据。

为了警告用户应用程序的会话超时,我使用 Travis Collins's Timeout Control 的修改版本来显示标题为“您的会话即将到期”的 ModalPopupExtender 和按钮“保持登录”和“注销”。单击“保持登录”时,它会回调一个空方法,该方法会重置会话计时器(我相信是因为每个 HttpRequest 都会调用ResetItemTimeout)。

为了防止服务中的会话在应用程序中的会话之前超时,我将它们的超时设置为更长,并计划在应用程序中重置会话计时器时对其调用一个空方法。但是,正在重置的计时器没有Session-State Event

我是否必须覆盖ResetItemTimeout?我该怎么做呢? 还是有其他方法可以实现我的目标(例如,在应用服务处于活动状态时保持服务会话处于活动状态)?我正在考虑扩展我的超时控制以通过应用发送心跳(例如Tim Mackey's idea)。

【问题讨论】:

  • 是 .Net Web 应用程序还是浏览器(来自 JavaScript)调用了 Web 服务?
  • .net Web 应用程序

标签: asp.net web-services web-applications session timeout


【解决方案1】:

我不确定我是否跟随。你是说在 webservice 上调用空方法不会重置会话计时器?

此外,这似乎是很多开销。为什么不将 Web 应用程序和 Web 服务设置为使用相同的会话 cookie?

【讨论】:

  • 你的第一个:我假设调用一个空方法会重置计时器;问题是在哪里调用该方法。你的第二个:我不认为 .net 可以共享 cookie,因为第一个位于浏览器和网络应用程序之间,而第二个位于网络应用程序和服务之间。
【解决方案2】:

如果您要或多或少地自动延长超时时间,为什么不一开始就把它设置得很高呢?吻。并省去在不需要的地方编写代码的麻烦。

【讨论】:

  • 超时时间越大,内存中保存的会话就越多,服务器需要的资源也就越多。为了保证,服务会话不能在应用会话需要无限超时之前超时,因此需要无限的服务器资源。如果我使非活动会话超时,那么我只需要与我的用户负载成比例的资源。
【解决方案3】:

当 .Net 应用程序调用 Web 服务时,.Net Web 应用程序是 客户端 并拥有会话。 Web 服务的会话 - 在最好的情况下 - 特定于 .Net Web 应用程序,而不是使用浏览器的用户,他是 Web 应用程序的客户端。

我认为默认情况是即使每次进行 Web 服务调用时会话都会启动(Web 服务调用不保存会话状态所需的 cookie),因此它不会在调用之间存储任何内容。但我现在没有测试这个。有几种拨打电话的方式,我认为其中一些存储 cookie,而另一些则不存储。

但无论如何:在您的场景中,确实没有理由在 Web 服务中使用会话:对于 Web 服务,只有一个客户端(Web 应用程序),因此您也可以使用应用程序状态,如果你需要缓存数据什么的。

【讨论】:

  • Web 服务 可以 使用 cookie 保存会话状态:msdn.microsoft.com/en-us/library/… 在这种情况下,Web 应用程序的 每个会话 都是 Web 的客户端服务。
  • 好的,很抱歉怀疑你。我只是假设如果你知道如何做到这一点,你就不会这样做:这种传播 cookie/会话的方式看起来就像是一种 hack。完全违背 SOA 原则。但是也许您有充分的理由这样做...基本上,每次发出请求时都会重置会话计时器,因此要进行 Web 服务调用,您可以挂钩每次发出请求时触发的任何事件.例如。应用程序中的 BeginRequest(在 Global.asax.cs,Application_Start 添加 this.BeginRequest += your_event_for_web_service_call)
猜你喜欢
  • 2011-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-27
  • 2010-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多