【问题标题】:Session State variables aren't working会话状态变量不起作用
【发布时间】:2013-01-22 23:05:44
【问题描述】:

我正在编写一个 ASP.NET C# 网站,该网站需要访问数据库中的数据并将其显示给用户以供查看和编辑。它访问的特定数据基于登录的用户,我需要多个用户能够同时使用该站点,同时查看和编辑不同的数据。我偶然发现了会话状态的概念,经过大量阅读并没有太多理解。我遇到了一个问题。

在我的默认页面中,我这样做是为了创建一个 Session 变量:

Session.Add("UserData",userdata);

我也试过这个:

Session["UserData"] = userdata;

然后在稍后的页面中,我这样做是为了尝试调用它:

object myobject = Session["UserData"];

这给了我一个错误,说Session["UserData"] 未设置为对象的实例。这似乎是每个人都在使用的方法,是我遗漏了什么吗?

我的站点在 IIS 上配置为将会话状态模式设置为“进行中”,但大多数人似乎是使用他们的 web.config 文件手动设置的。但是,当我尝试在我的 web.config 文件中执行此操作时,总是会看到“无法识别的配置部分”。我的编译器不知道这是什么:

<sessionstate mode="inproc"/>

编辑,更详细的代码:

MyClass userdata = new MyClass();
userdata.name = "myname";
userdata.number = 5;

Session["UserData"] = userdata;

稍后...

MyClass mydata = (MyClass)(Session["UserData"]);

这会返回 Session["UserData"] 为空的错误。

【问题讨论】:

  • 在哪里初始化用户数据?调用Add时是否可能为null?
  • 你有 Session["UserData"] = userdata; ,您在哪里分配用户数据,您可以粘贴代码以便我们查看。 Session["UserData"] 应该可以工作,或者如果您正确分配它,我应该说它有一个值..
  • "userdata" 在这里是伪代码,在我调用任何代码之前,我 100% 确定这个变量包含数据。
  • 它是一个自定义类,会话变量是否仅限于基本类?
  • 你没有禁用cookies吗?

标签: c# asp.net session-state


【解决方案1】:

您无法在 web.config 中设置会话模式这一事实对我来说是一个危险信号,表明正在发生一些奇怪和难闻的事情。所以...

  1. 检查会话模式是否在 web.config 的 system.web 元素下,否则无效。

  2. 检查 web.config 或页面指令中的 enableSessionState 是否设置为 false

  3. 尝试排除 IIS。如果可能的话,将您的网站转换为 Web 应用程序并通过 Visual Studio 运行,以便从它自己的内置 Web 服务器开始。那会发生什么? Session 状态恢复了吗?

  4. 它应该不会有什么不同,但如果您没有在 Page_Load 中进行测试,那么只需在那里尝试一下 - 以防万一您在不寻常的地方进行这些测试。

无论答案是什么,当我们知道这将是显而易见的时候。我真的很期待找出它是什么。祝你好运

【讨论】:

  • 我确实使用辅助脚本设置了我的测试,这让我感到惊讶,但一旦我将它移到 Page_Load 它就可以正常工作。不知道那是关于什么的。
【解决方案2】:

会话变量可以很好地管理您网站上的多个用户,但要初始化它们,您应该在 Web 应用程序中使用 Global.asax 文件。该文件有两个专门用于 Session 变量的方法,Session_Start 和 Session_End。要初始化您的 Session 变量,您将使用 Global.asax 中的以下代码:

void Session_Start(object sender, EventArgs e) 
{
    // initialize session variable        
    Session["MySessionVar"] = 1;
}

此外,如果您对会话变量执行 + 等操作,您可能必须转换其值,例如,如果您有一个保存整数值的会话变量,您可能必须执行以下操作:

Session["MySessionVar"] = ((int) Session["MySessionVar]) + 1;

此外,如果您尝试在 Page_Load 或其他方法之外使用会话变量,例如尝试将其用作 C# 代码隐藏文件中的 System.Web.UI.Page 类的属性,则可能不行,你只能在一个方法中使用你的会话变量。

【讨论】:

    【解决方案3】:

    我会搜索对Session.ClearSession.Abandon 的任何调用,以查看您的会话是否在这两个操作之间被清除。

    您还可以连接到Session_End 事件,看看它是否在两次调用之间的某个时间被击中。

    【讨论】:

      【解决方案4】:

      你在哪里 Session.Add("UserData",userdata); 你想检查你需要像这样使用(字符串)投射对象的值

         string userdata= (string)(Session["UserData"]); 
      

      然后您可以运行检查以查看 if(string.IsNullOrEmpty(userdata)) 但不确定您是如何初始化并为 userdata 赋值的

      【讨论】:

        【解决方案5】:

        它是否抱怨您的myobject 为空或Session 为空?当您尝试从哪个类的方法中检索值时?

        还有一个问题 - 您是否尝试在并行线程中访问它?

        【讨论】:

          猜你喜欢
          • 2010-12-02
          • 1970-01-01
          • 2013-11-10
          • 2015-09-30
          • 2013-04-12
          • 2012-08-17
          • 2014-05-16
          相关资源
          最近更新 更多