c# - 来自 StateServer session 的 InvalidCastException

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

我编写的一个网站遇到了一个奇怪的问题,即在我对代码进行任何更新后,它突然无法立即识别存储在 session 中的项目。我搜索了 Stackoverflow/google/etc,可以看到其他人也有同样的问题,但无法在任何地方找到解决方案。

大致情况如下:

如果我将一个项目添加到我的购物篮中,它会存储一个 List<BasketItem>在 session 中。如果我随后对某些代码(不是 BasketItem)进行更新, session 变量仍然存在,但 .NET 似乎不认为它是 List<BasketItem>即使它肯定是。

当我在修改代码后尝试检索购物篮项目列表时,它抛出一个 InvalidCastException这只是没有任何意义,因为它基本上试图说它在之间转换的类型是不同的,即使它们不是。

异常(exception)情况是:

System.InvalidCastException: [A]System.Collections.Generic.List1[BasketItem] cannot be cast to [B]System.Collections.Generic.List1[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/

相关文章:

c# - 链接到本地​​目录中的图像与 URL,我做错了什么?

c# - 隐藏或删除微调器 Xamarin.Android

asp.net - IIS 将请求保留在队列中而不是处理这些请求

asp.net - 可以访问 session 状态的 Global.asax 事件

asp.net - 如何读取 web.config 中的 session 状态信息

c# - 使用两个同名元素解析 xml

c# - 排列是否存在

jquery - 如何使用 jQuery 迭代 gridview 或 listview?

asp.net - SQLException : Login failed for user 'NT AUTHORITY\NETWORK SERVICE

http - Facebook 和 Google 等可大规模扩展的网站如何实现 session ?