我编写的一个网站遇到了一个奇怪的问题,即在我对代码进行任何更新后,它突然无法立即识别存储在 session 中的项目。我搜索了 Stackoverflow/google/etc,可以看到其他人也有同样的问题,但无法在任何地方找到解决方案。
大致情况如下:
如果我将一个项目添加到我的购物篮中,它会存储一个 List<BasketItem>
在 session 中。如果我随后对某些代码(不是 BasketItem)进行更新, session 变量仍然存在,但 .NET 似乎不认为它是 List<BasketItem>
即使它肯定是。
当我在修改代码后尝试检索购物篮项目列表时,它抛出一个 InvalidCastException
这只是没有任何意义,因为它基本上试图说它在之间转换的类型是不同的,即使它们不是。
异常(exception)情况是:
System.InvalidCastException: [A]System.Collections.Generic.List
1[BasketItem] cannot be cast to [B]System.Collections.Generic.List
1[BasketItem]. Type A originates from 'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' in the context 'LoadNeither' at location 'C:\Windows\assembly\GAC_64\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll'. Type B originates from 'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' in the context 'LoadNeither' at location 'C:\Windows\assembly\GAC_64\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll'.
我将 StateServer 用于 session 状态并运行 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 casting”,所以我不会出错,但这确实意味着当代码更新时用户的购物车正在丢失。
如有任何建议,我们将不胜感激!
干杯
蒂姆
最佳答案
由于 BinaryFormatter
的原因,这种类型 的问题非常普遍。存储基础类型数据,如果它们不能解析为完全相同,这可能会导致问题 BasketItem
你想到的。最常见的情况是,当更改应用程序/库的版本时,或者存在具有不同状态的不同服务器时,这会造成伤害。
我的强烈建议是:不要让它使用 BinaryFormatter
存储状态!它不是版本友好,无论是在这方面还是在一个类型中的一些其他问题。如果可能的话,我强烈建议您考虑使用强大的基于契约(Contract) 的数据(意思是:除 BinaryFormatter
/NetDataContractSerializer
之外的几乎所有数据)。示例:
- 你可以使用
JavaScriptSerializer
并存储一个基本的string
的数据 - 你可以使用
XmlSerializer
并存储一个基本的string
的数据 - 如果你想要二进制文件,你可以使用 protobuf-net 并存储一个
byte[]
的数据
你显然会使用辅助方法来存储/检索你的数据,通常使用通用的 void Store<T>(string key, T object)
和 T Retreive<T>(string key)
, 使用 typeof(T)
内部根据需要。这样做的好处是存储的数据现在不受任何特定实现的影响,并且可以被应用程序的其他版本使用(因为没有类型依赖),甚至可以在必要时被其他平台(Java、php 等)使用.
我很欣赏这是一个围绕问题的旁路,而不是直接的解决方案 - 但是:它有效。
关于c# - 来自 StateServer session 的 InvalidCastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8413510/