StateServer会话中的InvalidCastException

时间:2011-12-07 10:05:19

标签: c# asp.net session-state .net stateserver

我写过的网站遇到了一个奇怪的问题,即在我对代码进行任何更新后,它突然无法识别会话中存储的项目。我搜索过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',所以我没有错误,但它确实意味着用户的篮子在代码更新时丢失了。

非常感谢任何建议!

干杯

1 个答案:

答案 0 :(得分:1)

这个类型的问题非常常见,因为BinaryFormatter存储了基础类型数据,如果它们无法解析为完全你想到的同样BasketItem。最常见的是,在更改应用程序/库的版本时,或者存在具有不同状态的不同服务器时,这会受到伤害。

我的强烈建议在这里是:不要让它使用BinaryFormatter存储状态! 非常友好,在这方面以及 类型中的一些其他问题。如果可能,我建议您考虑使用强大的基于合同的数据(意思是:除BinaryFormatter / NetDataContractSerializer以外的其他任何数据)。例子:

  • 您可以使用JavaScriptSerializer并存储数据的基本string
  • 您可以使用XmlSerializer并存储数据的基本string
  • 如果你想要二进制文件,你可以使用protobuf-net和strore byte[]数据

您显然会使用辅助方法来存储/检索您的数据,通常使用通用void Store<T>(string key, T object)T Retreive<T>(string key),必要时在内部使用typeof(T)。这样做的好处是,存储的数据现在是任何特定实现的中立,并且可以由应用程序的其他版本使用(因为没有任何类型依赖),甚至是必要的其他平台(Java,php等)

我很欣赏这是围绕问题而不是直接解决方案的一步一步 - 但是:它有效。