【问题标题】:ASP.NET Session StateASP.NET 会话状态
【发布时间】:2011-06-07 17:23:44
【问题描述】:

我在 ASP.NET Web 应用程序中遇到一个与会话状态相关的奇怪异常。注意:代码是由第 3 方生成的......

基本上我得到一个 HttpException 的描述:

只有在 enableSessionState 设置为 true 时才能使用会话状态,无论是在配置文件中还是在 Page 指令中。还请确保 System.Web.SessionStateModule 或自定义会话状态模块包含在应用程序配置的 \\ 部分中。

发生故障的代码如下所示:

public class ExtendedWebPage : System.Web.UI.Page
{

    protected override void OnInit(EventArgs e)
    {
        base.OnInit(e);
        if (Context.Session != null)
        {
            if (Session.IsNewSession || Session["UserID"] == null)   <--- Errors Here
            {

我在 if 语句的测试中遇到了异常,但是当我询问 Context.Session 时它很好。到目前为止,浏览器已经通过了一个很好的登录页面并设置了一些我可以看到 Context.Session 的 Session 变量,但是 this.Session 正在抛出异常。

有什么想法吗?

谢谢,

菲利普

【问题讨论】:

  • 我认为这里的问题是 Context.Session 和 Session 不是一回事。
  • 我很欣赏 Session 是在 Page 中定义的虚拟属性,但是 Session 属性使用 Context.Session,如果基础字段 _session 为 null,则返回异常。
  • 实际的错误信息是什么?
  • 嗨 Simon831:错误消息是“会话状态只能在 enableSessionState 设置为 true 时使用,无论是在配置文件中还是在页面指令中。还请确保 System.Web.SessionStateModule或者自定义会话状态模块包含在应用程序配置的 \\ 部分中。”

标签: asp.net session-state


【解决方案1】:

您是否在 aspx 标记中的 @Page 指令中检查了该页面的 Session 没有被禁用? Further info here.

【讨论】:

  • 本来是要提出同样的建议,这让我很不爽。
  • 是的,我看过了,它没有明确设置,所以我假设它的默认设置是支持会话状态:
  • 查看 web.config 并查看会话已全局启用。如果 Session 没有在 Page-directive 中明确设置,它由 web.config 中的设置继承,它也由 machine.config 继承其设置
  • 查看 Session 属性是如何使用反射器实现的另一个奇怪的事情是,仅当基础 _session 字段为空且 _sessionRetrieved 为真时才会引发异常。当 _session 设置为 Context.Session 时,_sessionRetrieved 设置在相同的控制路径中(我猜这可能会失败)。如果我设置 base._sessionRetrieved = false,则使用调试器,然后调用 this.Session 就可以了。确实很奇怪,也许有某种竞争条件?
  • 我已经在 web.config 和 machine.config 中查看了 machine.config 具有 httpModule 的机器,并且 web.config 中没有会话状态指令,因此应该使用默认行为
【解决方案2】:

最后通过在后面的代码中重命名页面和类解决了这个问题。创建一个新页面,将标记复制并粘贴到 ASPX 中,并将重命名类的主体复制并粘贴到新类的主体中。代码现在执行超出了它曾经失败的点。

还有 3 个小时我不会回来... :-S

【讨论】:

    猜你喜欢
    • 2010-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-28
    • 2011-10-11
    • 2010-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多