C# 存储在SQL中的HttpSessionState中的泛型列表
我正在开发一个aspx应用程序(C#),在这个应用程序中,我使用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
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!!
}