【问题标题】:What actually causes Session_Start to be called?实际上是什么导致 Session_Start 被调用?
【发布时间】:2009-03-22 14:51:47
【问题描述】:

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

问题 1: 是什么给出的? Session_Start() 何时真正被调用?我认为这是会话开始的时候,但不是每个新请求序列的开始都会导致会话自动启动吗?当然,当我使用 F5 运行时,会话应该开始,为什么不呢。

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

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

【问题讨论】:

  • 能否详细说明“初始化数据库”?
  • 详细说明。我基本上是在告诉 Db4o 使用特定文件来绘制数据
  • 意外双发。删除了另一个,这个有更多信息。

标签: .net asp.net session


【解决方案1】:

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

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

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

<%@ Page EnableSessionState="ReadOnly" %>

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 嗯..好的。也许将代码放在 BeginRequest() 中是有意义的,但是有没有办法在 EndRequest() 中放置一个处理程序,以便我可以关闭数据库文件?
    • 我可能对此并不完全正确......我在网上看到的事情是它可能是一个可以通过“aspnet_regiis.exe -i”解决的asp.net配置问题。我会先试试!
    【解决方案3】:

    嗯..好的。也许有意义 将代码放入 BeginRequest() 但 有一种方法可以将处理程序放在 EndRequest() 我可以关闭 数据库文件?

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

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

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

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

    【讨论】:

    • 是的,这是一个有用的建议。那么问题 1. session_start 到底应该在什么时候触发呢?
    • 嗨乔治,我不确定,但我猜“Keltex”的方向是正确的,当您从 Session_Start 处理程序(例如在 Page_Load 方法中的某处)。
    【解决方案4】:

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

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

    【讨论】:

    • 这是开发网络服务器。就像我上面所说的,我不担心正确的数据库会话管理。这是一个演示应用程序,无论如何我都在使用 Db4o。我只是想确保在有人尝试使用它之前打开它。
    • 我将 添加到我的 web.config 中。 Session_Start() 仍然没有触发
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-01
    • 1970-01-01
    • 2010-12-02
    • 2021-05-12
    • 2011-08-01
    • 2011-12-26
    • 1970-01-01
    相关资源
    最近更新 更多