我编写的一个站点遇到了一个奇怪的问题,在我对代码进行任何更新之后,它突然无法识别会话中存储的项。我搜索了Stackoverflow / google / etc,发现其他人也有同样的问题,但在任何地方都找不到解决方案。
下面是发生的大致情况:
如果我将一个项目添加到我的篮子中,它将在会话中存储一个List<BasketItem>。如果然后对某些代码(而不是BasketItem)进行更新,会话变量仍然存在,但是.NET似乎并不认为它是一个List<BasketItem>,尽管它确实存在。
当我尝试在修改代码后检索篮项列表时,它会抛出一个InvalidCastException,这完全没有任何意义,因为它基本上是想说它正在转换的类型是不同的,尽管它们不是。
例外是:
ASystem.Collections.Generic.List1[BasketItem] cannot be cast to [B]System.Collections.Generic.List1BasketItem.:
System.InvalidCastException类型A来源于位于'C:\Windows\assembly\GAC_64\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll'.的上下文'LoadNeither‘中的'mscorlib、Version=2.0.0.0、Culture=neutral、PublicKeyToken=b77a5c561934e089’类型B来源于位于'C:\Windows\assembly\GAC_64\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll'.的上下文'LoadNeither‘中的'mscorlib、Version=2.0.0.0、Culture=neutral、PublicKeyToken=b77a5c561934e089’
我使用StateServer作为会话状态,并运行ASP.NET 3.5 SP1 (如果这有帮助的话)。
我使用的代码如下:
// for setting the basket
List<BasketItem> basketItems = new List<BasketItem>();
Session["basket"] = basketItems;
// for getting the basket
List<BasketItem> basketItems = (List<BasketItem>)Session["basket"];目前,我使用的是“as强制转换”,这样我就不会出错,但这确实意味着当代码更新时,用户的篮子就会丢失。
任何建议都将不胜感激!
干杯
时间
发布于 2011-12-07 10:18:46
由于BinaryFormatter存储底层类型数据的方式,这种类型的问题非常常见,如果它们不能解决与您想象中的相同的BasketItem,则会导致问题。最常见的情况是,当更改应用程序/库的版本或有不同状态的不同服务器时,这会造成伤害。
我的强烈建议是:不要让它使用BinaryFormatter来存储状态!并不是非常友好的版本,无论是在这方面还是在一个类型中的一些其他问题。如果可能的话,我建议您考虑基于契约的强数据(意思是:除了BinaryFormatter /NetDataContractSerializer之外,其他几乎任何东西)。示例:
JavaScriptSerializer并存储数据string您可以使用XmlSerializer并存储数据H 120的基本string >如果您想要二进制,您可以使用数据<代码>H 222F 223的数据的protobuf-net和strore a byte[]。
显然,您将使用助手方法存储/检索数据,通常使用通用的void Store<T>(string key, T object)和T Retreive<T>(string key),必要时在内部使用typeof(T)。这样做的好处是,存储的数据现在是任何特定实现的中性数据,并且可以被应用程序的其他版本所使用(因为不依赖于任何类型),甚至在必要时也可以被其他平台(Java、php等)使用。
我理解这是解决问题的一个侧面,而不是一个直接的解决方案--但是:它是有效的。
https://stackoverflow.com/questions/8413510
复制相似问题