【问题标题】:Generic Lists in a HttpSessionState stored in SQL存储在 SQL 中的 HttpSessionState 中的通用列表
【发布时间】:2013-04-15 08:31:39
【问题描述】:

我正在开发一个 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.Property1myClass.Property2 将保存我之前设置的字符串,但myClass.Property3 是一个空列表。

【问题讨论】:

  • 您是否已将应用程序配置为使用 sql server 进行会话状态?看到这篇关于如何做的帖子stackoverflow.com/questions/7394357/…
  • 是的。此应用程序托管在具有多个站点的 Web 服务器上,并且服务器上的所有其他站点基本上都使用 SQL 进行会话状态。另外 - 请记住,在我的应用程序中,它将所有数据存储在对象中,除了列表(已初始化,但为空)!
  • 您能在存储和读取列表对象的位置显示您的代码吗?
  • @PrashantLakhlani - 看看我编辑的问题。

标签: c# asp.net .net session-state


【解决方案1】:

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

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

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

没有看到您的实际代码,很难确定(尽管您的示例代码很好地阐明了您的意思)。但这在我看来很有可能。

【讨论】:

  • 我基本上最终重新分解代码以避免整个问题,但我认为您对参考资料的看法是正确的。实际代码在这里很难提供,因为它“分散”在许多方法和类中。但是,当我更多地查看代码时,我看到一些地方可能会遇到您所描述的引用问题。
  • @Superhubert 太棒了!是的,你的方法(重构)可能是最好的方法=)我很高兴我能提供一些见解。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-16
  • 2012-10-16
  • 1970-01-01
  • 2020-11-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多