在ASP.NET中管理会话超时时间

4
我有一个ASP.NET 2.0 Web应用程序,与多个ASP.NET 2.0 Web服务进行通信。两者都使用ASP.NET会话来持久化会话数据。
为了警告用户应用程序的会话超时,我使用Travis Collins's Timeout Control的修改版本来显示一个标题为“您的会话即将过期”的ModalPopupExtender,并显示“保持登录”和“注销”按钮。点击“保持登录”会回调到一个空方法,该方法重置会话计时器(我认为是因为每个HttpRequest都会调用ResetItemTimeout)。
为了防止服务中的会话在应用程序之前超时,我将它们的超时时间设置得更长,并计划在应用程序中重置会话定时器时调用它们的空方法。但是,没有Session-State Event来重置计时器。
我必须覆盖ResetItemTimeout吗?我该如何做? 还是有其他方法可以实现我的目标(例如,在应用程序服务处于活动状态时保持服务会话处于活动状态)?我正在考虑扩展超时控件以通过应用程序发送心跳(例如Tim Mackey's idea)。

是 .Net Web 应用程序还是浏览器(通过 JavaScript)在调用 Web 服务? - Ope
.NET Web应用程序 - Sam
3个回答

0

我不确定我理解了。您是说在 Web 服务上调用空方法不会重置会话计时器吗?

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


你的第一句话:我假设调用一个空方法会重置计时器;问题在于何时调用该方法。你的第二句话:我认为 .net 无法共享 cookies,因为第一个位于浏览器和 Web 应用程序之间,而第二个位于 Web 应用程序和服务之间。 - Sam

0
当 .Net 应用程序调用 Web 服务时,它是 .Net Web 应用程序,拥有会话的是客户端,而不是使用浏览器作为 Web 应用程序客户端的用户。Web 服务的会话在最佳情况下是特定于 .Net Web 应用程序,而不是用户。
我认为默认情况下,每次进行 Web 服务调用时会启动会话(Web 服务调用不保存必需的会话状态 cookie),因此不会在调用之间存储任何内容。但我现在没有测试这个问题。有几种调用方式,其中一些会存储 cookie,而另一些则不会。
但无论如何:在您的情况下,真的没有理由在 Web 服务中使用会话:对于 Web 服务,只有一个客户端(Web 应用程序),因此如果需要缓存数据或其他内容,也可以使用应用程序状态。

Web服务可以使用cookie保存会话状态: http://msdn.microsoft.com/zh-cn/library/system.web.services.webmethodattribute.enablesession(VS.80).aspx在这种情况下,Web应用程序的每个会话都是Web服务的客户端。 - Sam
好的,对不起我怀疑你了。我只是假设如果你知道如何做这个,你就不会这样做:这种传播cookie/session的方式似乎很像黑客行为,完全违反面向服务架构(SOA)的原则。但也许你有充分的理由来这样做...基本上,每次请求时会重置会话计时器,所以要进行Web服务调用,你可以钩入任何每次请求时触发的事件。例如,在应用程序中的BeginRequest(在Global.asax.cs中,Application_Start添加this.BeginRequest += your_event_for_web_service_call) - Ope

-1

如果你要自动延长超时时间,为什么不一开始就将其设置得非常高呢?保持简单并节省你不必要编写的代码。


超时时间越长,将会在内存中保留更多的会话,并且服务器将需要更多的资源。为了保证服务会话不会在应用程序会话之前超时,需要无限超时时间,因此需要无限的服务器资源。如果我超时不活动的会话,那么我只需要与用户负载成比例的资源。 - Sam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接