Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 存储在SQL中的HttpSessionState中的泛型列表_C#_Asp.net_.net_Session State - Fatal编程技术网

C# 存储在SQL中的HttpSessionState中的泛型列表

C# 存储在SQL中的HttpSessionState中的泛型列表,c#,asp.net,.net,session-state,C#,Asp.net,.net,Session State,我正在开发一个aspx应用程序(C#),在这个应用程序中,我使用HttpSessionState在视图更改之间的代码隐藏中保存不同的对象。其中一些对象包含通用列表(List),但当我使用SQL数据库存储状态时,这些列表似乎不会被保存(sessionState mode=“SQLServer”)。对象中的所有其他属性都会保存,但当我尝试检索列表时,会得到空列表 有趣的是,如果我使用sessionState mode=“InProc”,一切都很好 我的类具有Serializable属性。我正在运行C

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

有趣的是,如果我使用
sessionState mode=“InProc”
,一切都很好

我的类具有
Serializable
属性。我正在运行C#/.NET4.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; }
}

因此
myClass.Property1
myClass.Property2
将保留我之前设置的字符串,但是
myClass.Property3
是一个空列表。

如果

  • 在通用列表中存储对对象的引用,该引用在存储时有效,但
  • 该引用在后续请求中不再有效
例如,存储对
页.Controls
集合中控件的引用-如果您尝试在另一次回发中检索该引用,则该引用无效。事实上,引用可能只是通过垃圾收集来清理的(这就是为什么您的列表看起来是空的)


在没有看到实际代码的情况下,很难说清楚(尽管示例代码很好地阐明了您的意思)。但在我看来,这很可能发生。

如果您

  • 在通用列表中存储对对象的引用,该引用在存储时有效,但
  • 该引用在后续请求中不再有效
例如,存储对
页.Controls
集合中控件的引用-如果您尝试在另一次回发中检索该引用,则该引用无效。事实上,引用可能只是通过垃圾收集来清理的(这就是为什么您的列表看起来是空的)


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

您是否将应用程序配置为使用sql server作为会话状态?请看这篇关于ho wto的帖子,做吧,是的。此应用程序托管在具有多个站点的web服务器上,服务器上的所有其他站点基本上都使用SQL作为会话状态。还要记住,在我的应用程序中,它存储对象中的所有数据,但列表除外(列表已初始化,但为空)!您能将代码显示在存储和读取列表对象的位置吗?@PrashantLakhlani-看看我编辑的问题。您是否将应用程序配置为使用sql server作为会话状态?请看这篇关于ho wto的帖子,做吧,是的。此应用程序托管在具有多个站点的web服务器上,服务器上的所有其他站点基本上都使用SQL作为会话状态。还要记住,在我的应用程序中,它存储对象中的所有数据,但列表除外(列表已初始化,但为空)!你能把你的代码显示在你存储和读取列表对象的地方吗?@PrashantLakhlani-看看我编辑过的问题。我基本上是通过重新分解代码来避免整个问题,但我认为你对引用的看法是正确的。这里很难提供实际的代码,因为它“分散”在许多方法和类上。但是,当我进一步查看代码时,我看到了一些地方,您描述的引用可能会出现问题。@superubert太棒了!是的,你的方法(重构)可能是最好的方法=)我很高兴我能提供一些见解。我基本上以重新分解代码来避免整个问题,但我认为你对引用的看法是正确的。这里很难提供实际的代码,因为它“分散”在许多方法和类上。但是,当我进一步查看代码时,我看到了一些地方,您描述的引用可能会出现问题。@superubert太棒了!是的,你的方法(重构)可能是最好的方法=)我很高兴我能提供一些见解。
    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!!
    }