ASP.NET不能在同一类型变量中强制转换会话变量

本文关键字:转换 会话 变量 类型变量 不能 NET ASP | 更新日期: 2023-09-27 17:50:55

我有一些"几乎随机"的错误,而试图将会话变量转换为它所属的变量类型。为了说清楚:

我有一个类"Elemento",我只是创建了它的一个实例,并把它放在我的会话变量:

Elemento elem = new Elemento(id, quantity);
list.Add(elem);
context.Session["cart"] = list;

现在我必须恢复我的列表,我试着这样做:

list = (List<Elemento>)context.Session["cart"];

好. .这个"有时"行得通,有时不行!我第一次尝试它工作完美无瑕,但现在我有"内部服务器错误500"这个错误:

不可能的需求将cast di[一]System.Collections.Generic。列出1[Elemento] a [B]System.Collections.Generic.List 1[Elemento]。我想这是一个起源da 'mscorlib, Version=2.0.0.0, Culture=neutral,PublicKeyToken=b77a5c561934e089' nelcontesto 'LoadNeither' nellaposizione"C: ' Windows '会议' GAC_64 ' mscorlib ' 2.0.0.0__b77a5c561934e089 ' mscorlib.dll"。i tipo B为原始数据库,版本=2.0.0.0,文化=中性,PublicKeyToken=b77a5c561934e089' nelcontesto 'LoadNeither' nellaposizione"C: ' Windows '会议' GAC_64 ' mscorlib ' 2.0.0.0__b77a5c561934e089 ' mscorlib.dll"。

翻译它. .

不能强制转换[A]System.Collections.Generic。列出1[Elemento] to [B]System.Collections.Generic.List 1[Elemento]。A型有起源from 'mscorlib, Version=2.0.0.0, Culture=neutral,PublicKeyToken=b77a5c561934e089'与上下文'LoadNeither'和位置"C: ' Windows '会议' GAC_64 ' mscorlib ' 2.0.0.0__b77a5c561934e089 ' mscorlib.dll"。类型B来自'mscorlib, Version=2.0.0.0, Culture=neutral,PublicKeyToken=b77a5c561934e089'与上下文'LoadNeither'和位置"C: ' Windows '会议' GAC_64 ' mscorlib ' 2.0.0.0__b77a5c561934e089 ' mscorlib.dll"。

我可以解决这个"一段时间"清空IIS缓存。但是当我在visual studio中构建解决方案时,它会再次发生。

我读在一些地方,我可以解决这个使用接口…但是因为我还在学习如何使用它们,我现在不能直接尝试,有一些经过测试的解决方案吗?

编辑:使用krshekhar解决方案:

list = context.Session["cart"] as List<Elemento>;

谢谢!

ASP.NET不能在同一类型变量中强制转换会话变量

我认为这可能是IIS内存的问题。您是否尝试重新启动IIS?使用其他IIS服务器?

我建议使用其他方式来存储对象——比如Cookies。

如果你考虑可伸缩性- cookie将为你提供比会话对象更好的解决方案,因为它们存储在客户端而不是服务器。

祝你好运

既然你提到你在重建时得到错误,似乎这里的可能性是Elemento类或它引用的另一个类中的字段发生了变化,这破坏了对象从会话状态的反序列化。

当将"复杂"对象存储到IIS会话状态时,使用BinaryFormatter(在System.Runtime.Serialization.Formatters.Binary命名空间中)对它们进行序列化。此格式化程序对正在序列化的类中的更改很敏感,如果自数据最初序列化以来图中的任何类发生了更改,则可能无法成功反序列化对象图。这似乎是这里的问题,因为你说它在重建后破裂。

我建议你要么只将BCL中的类型保存到会话状态中(因为这些类型只会在。net版本之间改变)。或者更好的是,通过在Elemento对象上实现ISerializable接口来实现您自己的自定义序列化,这将允许您维护项目构建之间的兼容性。