gpt4 book ai didi

c# - 来自 StateServer session 的 InvalidCastException

转载 作者:行者123 更新时间:2023-11-30 17:14:48 28 4
gpt4 key购买 nike

我编写的一个网站遇到了一个奇怪的问题,即在我对代码进行任何更新后,它突然无法立即识别存储在 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.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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com