【问题标题】:ASP.NET cannot cast session variable in same type variableASP.NET 无法将会话变量转换为相同类型的变量
【发布时间】:2012-12-22 04:09:01
【问题描述】:

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

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

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.List1[Elemento] a [B]System.Collections.Generic.List1[Elemento]。 Il Tipo A ha origin da 'mscorlib,版本=2.0.0.0,文化=中性, PublicKeyToken=b77a5c561934e089' nel 竞赛 'LoadNeither' nella 定位 '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 竞赛 'LoadNeither' nella 定位 'C:\Windows\assembly\GAC_64\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll'。

翻译它..

无法投射 [A]System.Collections.Generic.List1[Elemento] to [B]System.Collections.Generic.List1[Elemento]。 A型有起源 来自'mscorlib,版本=2.0.0.0,文化=中性, 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 构建解决方案时,它会再次发生。

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

编辑: 适用于 krsekhar 解决方案:

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

谢谢!

【问题讨论】:

  • 检查你的会话 context.Session["cart"] 是否存在,并且在转换之前不为空。
  • 是的,我已经这样做了,很抱歉没有在主帖中写出来!
  • 尝试使用 list = context.Session["cart"] as List;
  • 哇!好像这行得通!在第一次运行时,我在下一个指令中遇到错误,但重新启动 IIS 似乎一切正常!我希望这是稳定的eheh,谢谢!
  • 你说它在你重建之前有效。每次重建时都会中断,还是仅在 Elemento 类发生更改时中断?

标签: c# asp.net iis casting


【解决方案1】:

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

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

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

【讨论】:

  • 使用 krshekhar 的解决方案一切正常,我希望我不能重新实现 ISerializable 接口,嗯,但是.. 即使使用这个解决方案,有时我也会从会话中得到一些损坏的数据.. 它与我构建它的时间无关,或者时间过去了,或者使用的浏览器..还是不明白为什么
【解决方案2】:

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

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

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

祝你好运

【讨论】:

  • 我不能为此使用 cookie :( 重新启动 IIS 工作.. 直到我再次构建项目!whaaattt
猜你喜欢
  • 2014-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多