什么导致Session_Start被调用?

时间:2009-03-22 14:51:47

标签: .net asp.net session

在我正在构建的一个小型演示应用程序中,我将代码放在Global.Session_Start()事件中初始化数据库。但是,我注意到当我在开发服务器上的调试器中运行应用程序时,此事件不会触发(尚未在其他任何地方进行测试)。

问题1:给出了什么?什么时候Session_Start()实际上被调用?我假设它是在会话开始时但是不应该每个新的请求序列的开始导致会话自动启动?当然,每当我使用F5运行时,会话应该开始,所以为什么不呢。

问题2:有一个更好的地方,初始化数据库的代码应该去哪里?我宁愿不把它放在Application_Start方法中,因为它在调试时并不总是被调用。

PS。通过初始化数据库,我并不是说我打开了与SqlServer的连接并让它永远打开。我正在使用db4o,我打开一个预先构建的数据库文件。就像我说这只是一个演示应用程序,我并不担心资源管理不善或类似的事情。

4 个答案:

答案 0 :(得分:6)

我知道这是一个老帖子,但也许这会对某人有所帮助:

除非您实际读取或写入会话对象,否则不会触发session_start。

如果您想使用session_start事件但根本不需要使用会话存储,则可以将以下内容添加到目标网页的页面指令中:

<%@ Page EnableSessionState="ReadOnly" %>

这将导致session_start事件触发,而您不必在会话对象中存储任何内容。

答案 1 :(得分:3)

在您访问Session对象之前,我不完全确定会话“启动”。否则,启动不需要的会话似乎是不必要的开销。

答案 2 :(得分:2)

  

Hmm..ok。也许它会有意义   将代码放在BeginRequest()中,但是   有办法把处理程序放在   EndRequest()我可以关闭它   数据库文件?

问题在于,您永远不能依赖这些事件来触发,因为ASP.NET运行时决定它们是否被触发,因为它们甚至可能不是必需的,可以跳过以节省资源。

例如,Response.Redirect通过使用ThreadAbortException取消对请求的整个处理,之后的页面/控件生命周期事件根本不会被触发,这就是为什么例如没有End_Request或类似的东西。

我会考虑将您的逻辑移动到另一个层(独立于ASP.NET),并且可能在从页面实际请求时初始化数据库?然后,您可以在需要信息的相同方法中关闭数据库文件,这将使您更加独立于应用程序/会话所处的状态。

不确定这是否是您正在寻找的信息:)

答案 3 :(得分:1)

你使用什么会话模型?如果是SQL Server支持的会话,则可能无法启动新会话。在InProc的情况下,我认为它应该工作。正如您所指出的,Application_Start有时会在调试器可以附加之前触发它。

您使用IIS还是开发Web服务器?对于IIS,this article建议您首先需要将其创建为应用程序。