ASP.NET无法在同一类型变量中转换会话变量

时间:2013-01-08 10:18:42

标签: c# asp.net iis casting

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

我有一个“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.List {1}} 1 [Elemento的]。 Il tipo哈哈的起源   da'mscorlib,版本= 2.0.0.0,文化=中立,   PublicKeyToken = b77a5c561934e089'nel contesto'LoadNeither'nella   posizione   'C:\ WINDOWS \装配\ 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 contesto'LoadNeither'nella   posizione   'C:\的Windows \组件\ GAC_64 \ mscorlib程序\ 2.0.0.0__b77a5c561934e089 \ mscorlib.dll中'。

翻译它..

  

无法投射[A] System.Collections.Generic.List 1[Elemento] a [B]System.Collections.Generic.List 1 [Elemento]。 A型有起源   来自'mscorlib,版本= 2.0.0.0,文化=中立,   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解决方案一起使用:

1[Elemento] to
  [B]System.Collections.Generic.List
谢谢你!

2 个答案:

答案 0 :(得分:0)

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

我建议使用其他方法存储对象 - 例如Cookies。

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

祝你好运

答案 1 :(得分:0)

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

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

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