我写过的网站遇到了一个奇怪的问题,即在我对代码进行任何更新后,它突然无法识别会话中存储的项目。我搜索过Stackoverflow / google / etc,可以看到其他人有同样的问题,但无法在任何地方找到解决方案。
以下是发生的事情:
如果我在购物篮中添加商品,则会在会话中存储List<BasketItem>
。如果我然后对某些代码(而不是BasketItem)进行更新,则会话变量仍然存在,但.NET似乎并不认为它是List<BasketItem>
,即使它肯定是。{/ p>
当我在修改代码后尝试检索篮子项目列表时,它会抛出一个InvalidCastException
,它没有任何意义,因为它基本上试图说它之间转换的类型是不同的,即使它们是不
例外是:
System.InvalidCastException: [A] {System.Collections.Generic.List {1}} 1 [BasketItem]。 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中'。
我正在使用StateServer作为会话状态并运行ASP.NET 3.5 SP1(如果有帮助的话)。
我正在使用的代码如下:
1[BasketItem] cannot be cast to
[B]System.Collections.Generic.List
目前我正在使用'as casting',所以我没有错误,但它确实意味着用户的篮子在代码更新时丢失了。
非常感谢任何建议!
干杯
添
答案 0 :(得分:1)
这个类型的问题非常常见,因为BinaryFormatter
存储了基础类型数据,如果它们无法解析为完全你想到的同样BasketItem
。最常见的是,在更改应用程序/库的版本时,或者存在具有不同状态的不同服务器时,这会受到伤害。
我的强烈建议在这里是:不要让它使用BinaryFormatter
存储状态! 不非常友好,在这方面以及 类型中的一些其他问题。如果可能,我建议您考虑使用强大的基于合同的数据(意思是:除BinaryFormatter
/ NetDataContractSerializer
以外的其他任何数据)。例子:
JavaScriptSerializer
并存储数据的基本string
XmlSerializer
并存储数据的基本string
byte[]
数据您显然会使用辅助方法来存储/检索您的数据,通常使用通用void Store<T>(string key, T object)
和T Retreive<T>(string key)
,必要时在内部使用typeof(T)
。这样做的好处是,存储的数据现在是任何特定实现的中立,并且可以由应用程序的其他版本使用(因为没有任何类型依赖),甚至是必要的其他平台(Java,php等)
我很欣赏这是围绕问题而不是直接解决方案的一步一步 - 但是:它有效。