在尝试将会话变量转换为其所属的变量类型时,我遇到了一些“几乎随机”的错误。 只是说清楚:
我有一个“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
谢谢你!
答案 0 :(得分:0)
我相信它可能是IIS内存的一个问题。您是否尝试重新启动IIS?使用另一个IIS服务器?
我建议使用其他方法存储对象 - 例如Cookies。
如果考虑可扩展性 - Cookies将为您提供比会话对象更好的解决方案,因为它们存储在客户端而不是服务器上。
祝你好运
答案 1 :(得分:0)
由于你提到你在重建时遇到错误,似乎这里的可能性是Elemento
类或它引用的另一个类中的字段发生了变化,这打破了对象的反序列化会话状态。
将“复杂”对象存储到IIS会话状态时,使用BinaryFormatter
(在System.Runtime.Serialization.Formatters.Binary
命名空间中)序列化它们。此格式化程序对要序列化的类中的更改很敏感,如果图中的任何类因数据最初序列化后发生更改,则可能无法成功反序列化对象图。这似乎是这里的问题,因为你说它在重建后会中断。
我建议您只将BCL中的类型保存到会话状态(因为这些只会在.NET版本之间更改)。或者更好的是,通过在ISerializable
对象上实现Elemento
接口来实现自己的自定义序列化,这将允许您保持项目构建之间的兼容性。