【问题标题】:When's the earliest i can access some Session data in global.asax?我最早什么时候可以访问 global.asax 中的一些 Session 数据?
【发布时间】:2009-04-19 08:10:41
【问题描述】:

我想在我的 global.asax 中检查 Session 是否包含一些键/值数据。我不确定最早可能的时间(和方法名称)是什么时候来检查这个。

谢谢:)

【问题讨论】:

标签: asp.net session global-asax


【解决方案1】:

我一直认为Application_AcquireRequestState 是 Global.asax 中第一个可以访问当前会话的事件。绝对不是Application_BeginRequest

【讨论】:

  • 这确实使 Session 在 MVC3 和 4 以及 IIS7 和 8 中可用,如果请求适合 ASP.Net 管道;例如,如果请求是针对 Controller 或 WebPage,则 Session 可用。但是,如果它用于图像、css 文件等,在大多数配置中 Session 不可用,甚至不返回 null - 只是尝试访问它会得到一个 HttpException。
  • 我知道这个答案很老,但我搜索了相同的答案。我发现了一些附加信息:Application_AcquireRequestState 是在处理程序执行请求之前获取会话的正确位置。如果您想知道会话是否可用,请检查 Context.Session 是否为空。这不会引发异常,在你知道之后,有一个会话你可以使用变量 Session 来访问它。
  • 我遇到了一个问题,Application_AcquireRequestState Session 仍然为空。仅当请求的处理程序实现 IRequiresSessionState 时才会启动会话。如果您无法更改处理程序但仍需要会话,则可以调用 'Context.SetSessionStateBehavior(SessionStateBehavior.Required);'在 Application_BeginRequest 中强制生成会话。
【解决方案2】:

MSDN 随便提到会话状态是在 Application_PostAcquireRequestState 事件期间获取的。我希望它在Life Cycle Overview 页面上重述。

您可以访问的最新会话状态在 Application_PostRequestHandlerExecute 中,因为它由 SessionStateModule 在下一个事件 Application_ReleaseRequestState 期间保存。

【讨论】:

  • AcquireRequestState 也有它可用;使用 PostAcquireRequestState 不会阻止 Session 对图像、css 文件等的请求抛出异常。
【解决方案3】:

您需要使用BeginRequest (http://msdn.microsoft.com/en-us/library/system.web.httpapplication.beginrequest.aspx),因为它是HttpApplication 对象(Global.asax 继承)上触发的第一个事件。

您将在此处了解有关 ASP.NET 应用程序生命周期的更多信息 - http://msdn.microsoft.com/en-us/library/ms178473.aspx(这是针对 IIS 5 和 IIS 6)。

【讨论】:

【解决方案4】:

根据link text,global.asax 中最早可以访问会话对象的事件是 global.asax 触发 Session_Start 事件时

Session__Start:当新用户访问应用程序网站时触发。
Session__End:当用户会话超时、结束或离开应用程序时触发网站

【讨论】:

  • 那些只会在有人第一次访问网站时触发,而不是在每次请求期间触发
猜你喜欢
  • 2010-12-14
  • 1970-01-01
  • 2015-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-09
  • 1970-01-01
相关资源
最近更新 更多