1

我正在开发一个 aspx 应用程序 (C#),我在其中使用HttpSessionState在视图更改之间的代码中保存不同的对象。其中一些对象包含通用列表 ( List<T>),但当我使用 SQL 数据库存储状态 ( ) 时,这些列表似乎没有保存sessionState mode = "SQLServer"。对象中的所有其他属性都被保存,但是当我尝试检索列表时,我得到了空列表。

有趣的是,如果我使用sessionState mode = "InProc".

我的课程有这个Serializable属性。我正在运行 C#/.NET 4.0。

任何想法,将不胜感激!

编辑:

只是用一些代码来澄清(不是逐字逐句!)。

我有我想保存(实例)到我的会话状态的类:

public class MyClass
{
    public string Property1 { get; set; }
    public string Property2 { get; set; }
    public List<MyOtherClass> Property3 { get; set; }
}

public class MyOtherClass
{
    public string AnotherProperty1 { get; set; }
    public string AnotherProperty2 { get; set; }
}

然后,在我的代码后面 - 一个操作保存以前类的对象:

    public void MyMethod()
    {
        MyClass myClass = new MyClass()
        {
            Property1 = "One string",
            Property2 = "One other string",
            Property3 = new List<MyOtherClass>() { new MyOtherClass() { AnotherProperty1 = "One", AnotherProperty2 = "Ohter" } }
        };

        HttpContext.Current.Session["MyKey"] = myClass;
    }

...另一个动作将检索该对象:

    public void MyOtherMethod()
    {
        MyClass myClass = (MyClass)HttpContext.Current.Session["MyKey"];

        int c = myClass.Property3.Count; // Will be 0!!
    }

所以myClass.Property1andmyClass.Property2将保存我之前设置的字符串,但是myClass.Property3是一个空列表。

4

1 回答 1

1

您描述的问题可能会发生,如果您

  • 在该通用列表中存储对对象的引用,该引用在您存储时有效,但是
  • 该参考在后续请求中不再有效。

一个示例是存储对Page.Controls集合中控件的引用 - 如果您尝试在另一个回发中检索它,此引用将无效。事实上,引用可能只是被垃圾收集清理掉了(这就是为什么你的列表看起来是空的)。

如果没有看到您的实际代码,很难确定(尽管您的示例代码在阐明您的意思方面做得很好)。但这对我来说似乎很可能。

于 2013-04-22T20:22:25.857 回答