【问题标题】:Cache contains data, but can't retrieve data缓存包含数据,但无法检索数据
【发布时间】:2011-04-18 11:24:40
【问题描述】:

这是我的代码:

List<Sale> sales = new List<Sale>();

if (Cache["Sales"] != null)
{
    sales = (List<Sale>)Cache["Sales"];
}
else
{
    ...
    Cache.Add("Sales", sales, null, DateTime.Now.AddMinutes(20),
        Cache.NoSlidingExpiration, CacheItemPriority.Normal, null);
}

当我尝试从缓存中提取数据时,我的“销售”对象为空。想知道为什么该代码会被命中,我在 VS 中运行了调试器以查看 Cache 对象中的内容。

缓存包含我需要的数据,但是当它从缓存中获取数据时,“销售”仍然为空。

我在这里做错了吗?

编辑:

我在投射时遇到此错误:

[A]System.Collections.Generic.List1[controls_mySales+Sale] cannot be cast to [B]System.Collections.Generic.List1[controls_mySales+Sale]。类型 A 源自位置 'C:\WINDOWS\assembly\GAC_32\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll' 的上下文 'LoadNeither' 中的 'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' .类型 B 源自位置 'C:\WINDOWS\assembly\GAC_32\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll' 的上下文 'LoadNeither' 中的 'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'

【问题讨论】:

  • 这是您代码库中唯一为该缓存键分配值的地方吗?
  • 您是否尝试过对List&lt;Sale&gt; 进行强制转换,而不是使用as 运算符?可能存在选角问题。
  • 如果存储 Sale 而不是 List&lt;Sale&gt; 会发生什么?你得到什么转换错误?

标签: c# .net caching


【解决方案1】:

as keyword 上的 MSDN 页面指出:

as 运算符就像一个演员表 除了它在 转换失败而不是提高 一个例外。

看起来这就是这里发生的事情 - 类型为 List&lt;Sale&gt; 的转换失败,并返回 null。您确定这是缓存中对象的类型吗?

编辑:

响应您的编辑,似乎与 binding contexts 有关的某种与程序集相关的序列化/反序列化问题老实说有点超出我的想象。我检查了一下,在 SO 上发现了以下两个问题,也许可以为您指明正确的方向:

Question 1
Question 2

希望这些链接对您有所帮助。

【讨论】:

【解决方案2】:
【解决方案3】:

显然有两个类Sale

它看起来像动态编译的 Page 或 UserControl 中的嵌套类。如果不查看更多代码,很难准确理解发生了什么,但也许当 Page/UserControl 出于某种原因重新编译时,它会获得一个新类型。

我会将Sale 类移到它自己的源文件中的非嵌套类中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-31
    • 1970-01-01
    • 2014-01-28
    • 2023-04-10
    • 1970-01-01
    • 2021-04-23
    • 1970-01-01
    • 2015-03-23
    相关资源
    最近更新 更多