首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自InvalidCastException会话的StateServer

来自InvalidCastException会话的StateServer
EN

Stack Overflow用户
提问于 2011-12-07 10:05:18
回答 1查看 1.4K关注 0票数 3

我编写的一个站点遇到了一个奇怪的问题,在我对代码进行任何更新之后,它突然无法识别会话中存储的项。我搜索了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 (如果这有帮助的话)。

我使用的代码如下:

代码语言:javascript
复制
// 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强制转换”,这样我就不会出错,但这确实意味着当代码更新时,用户的篮子就会丢失。

任何建议都将不胜感激!

干杯

时间

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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等)使用。

我理解这是解决问题的一个侧面,而不是一个直接的解决方案--但是:它是有效的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8413510

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档