4

我在尝试将会话变量转换为它所属的变量类型时遇到了一些“几乎随机”的错误。只是为了说清楚:

我有一个类“Elemento”,我只是创建它的一个 istance 并将它放在我的会话变量中:

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

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

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

好吧..这个“有时”有效,有时不行!我第一次尝试它时完美无瑕,但现在我遇到了“内部服务器错误 500”并出现此错误:

Impossibile eseguire il cast di [A]System.Collections.Generic.List 1[Elemento] a [B]System.Collections.Generic.List1[Elemento]。Il Tipo A ha origine da 'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' nel matcho 'LoadNeither' nella posizione 'C:\Windows\assembly\GAC_64\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll '。Il Tipo B ha origine da 'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' nel matcho 'LoadNeither' nella posizione 'C:\Windows\assembly\GAC_64\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll '。

翻译一下。。

无法投射 [A]System.Collections.Generic.List 1[Elemento] to [B]System.Collections.Generic.List1[Elemento]。类型 A 来自 'mscorlib,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089',上下文为 'LoadNeither',位置为 'C:\Windows\assembly\GAC_64\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll' . 类型 B 来自 'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' 上下文为 'LoadNeither' 和位置 'C:\Windows\assembly\GAC_64\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll' .

我可以解决这个“一段时间”清空 IIS 缓存的问题。但是当我从 Visual Studio 构建解决方案时,它会再次发生。

我在某个地方读到我可以使用接口解决这个问题.. 但由于我仍在学习如何使用它们,我现在不能直接尝试,有一些经过测试的解决方案吗?

编辑:与 krshekhar 解决方案一起使用:

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

谢谢你!

4

2 回答 2

0

我相信这可能是 IIS 内存的问题。您是否尝试重新启动 IIS?使用另一个 IIS 服务器?

我建议使用其他方式来存储对象 - 例如 Cookie。

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

祝你好运

于 2013-01-08T10:31:50.367 回答
0

由于您提到您在重建时遇到错误,因此这里的可能性似乎是Elemento类或它引用的另一个类中的字段发生了更改,这破坏了会话状态中对象的反序列化。

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

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

于 2013-01-08T11:50:54.027 回答