【发布时间】:2012-01-14 20:35:09
【问题描述】:
我编写的一个网站遇到了一个奇怪的问题,即在我对代码进行任何更新后,它突然无法立即识别会话中存储的项目。我搜索了 Stackoverflow / google / 等,可以看到其他一些人有同样的问题,但在任何地方都找不到解决方案。
大致如下:
如果我将一个项目添加到我的购物篮,它会在会话中存储一个List<BasketItem>。如果我随后对某些代码(不是 BasketItem)进行更新,会话变量仍然存在,但 .NET 似乎并不认为它是 List<BasketItem>,即使它肯定是。
当我在修改代码后尝试检索篮子项目列表时,它会抛出一个InvalidCastException,这没有任何意义,因为它基本上是在试图说它正在转换的类型是不同的,即使它们不是。
例外是:
System.InvalidCastException: [A]System.Collections.Generic.List
1[BasketItem] cannot be cast to [B]System.Collections.Generic.List1[BasketItem]。 A型起源 来自'mscorlib,版本=2.0.0.0,文化=中性, PublicKeyToken=b77a5c561934e089' 在上下文 'LoadNeither' 中 地点 'C:\Windows\assembly\GAC_64\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll'。 B 型源自 'mscorlib,Version=2.0.0.0,Culture=neutral, PublicKeyToken=b77a5c561934e089' 在上下文 'LoadNeither' 中 地点 'C:\Windows\assembly\GAC_64\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll'。
如果有帮助,我将 StateServer 用于会话状态并运行 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 cast',所以我不会出错,但这确实意味着更新代码时用户的购物篮会丢失。
任何建议将不胜感激!
干杯
提姆
【问题讨论】:
-
我想知道这是否与两种不同的 BasketItem 类型有关;您能否确认:是否有可能是从 1 个构建版本 saved 然后从另一个构建版本 loaded 加载的? BasketItem 是否可能来自 2 个不同的程序集?是否有可能您在同一个场中有不同的机器具有不同的构建版本,或者每台机器都在独立构建?
-
(错误消息告诉我们
List<>而不是BasketItem,这有点烦人,很难看出字符串是否会告诉我们一些明显的事情) -
嗨,马克,关于您的第一条评论——是的,我想 .NET 可能会从两个不同的程序集加载 BasketItem。每当 App_Code 发生更改时,我认为 .NET 会将其重新编译为新程序集。
-
当然可以。
标签: c# asp.net session-state .net stateserver