【问题标题】:Cache.Insert("") with absolute expiration off by UTC offsetCache.Insert("") 与 UTC 偏移量绝对过期
【发布时间】:2017-12-02 00:15:02
【问题描述】:

我有几个在生产服务器上的 asp.net webforms 站点突然出现缓存问题。问题是我的缓存值在使用 Cache.Insert 方法时没有保留。使用 Cache["key"] = value 仍然有效。

比如我这样设置一个值,检索的时候是null。

HttpRuntime.Cache.Insert("CacheTestVal", "Help Me!" null, DateTime.Now.AddHours(1), System.Web.Caching.Cache.NoSlidingExpiration);

当我这样设置值时,我可以检索到预期值

Cache["CacheTestVal"] = "Help Me!";

我需要能够为缓存值设置一个绝对过期时间,所以我不能使用 Cache[""] 方法。感谢所有帮助。谢谢。

编辑:我发现将绝对过期设置为 UTC 日期时间确实有效。我认为问题在于服务器在使用 DateTime.Now 时没有将绝对过期时间转换为 UTC。

HttpRuntime.Cache.Insert("CacheTestVal", "Help Me!" null, DateTime.UtcNow.AddHours(1), System.Web.Caching.Cache.NoSlidingExpiration);

日期/时间和时区都按照我在服务器上的预期设置,但可能 IIS 无法识别这一点,或者某处存在错误的配置值?

【问题讨论】:

  • 服务器时区是多少?从历史上看,使用本地时间在 ASP.NET 中进行缓存一直很痛苦。请改用DateTime.UtcNow
  • 谢谢阿德里亚诺。您说得对,将其更改为 UtcNow 确实为我解决了这个问题,但为什么行为会突然改变?缓存停止工作的早晨应用了 4 个 Windows 更新。
  • 老实说,我不知道,也许他们修复了其他问题,假设(错误地!)每个人都使用 UTC 时间。错了,因为我上次看到 msdn 时...他们在示例中使用了当地时间,但没有提到这个问题。
  • 我有一个网站已经运行多年,现在因为可能的补丁而陷入困境?我更改了我的代码 --FROM-- Cache.Insert(CacheKey, dt, null, DateTime.Now.AddMinutes(30), TimeSpan.Zero); --TO-- Cache.Insert(CacheKey, dt, null, System.Web.Caching.Cache.NoAbsoluteExpiration, new TimeSpan(0, 30, 0));
  • 在我的桌面更新了几次 Windows 后遇到了同样的问题

标签: asp.net caching


【解决方案1】:

这种行为变化可能是由于在计算机上安装了 .NET 4.7 造成的。下面链接的文章说,Microsoft 将在 .NET 的下一版本和下一个修补程序中修复此问题。

引用微软页面的部分内容:

症状:

假设您在一个计算机上安装了 Microsoft .NET Framework 4.7 计算机。当您尝试通过使用将项目插入 Cache 对象时 Cache.Insert(字符串、对象、CacheDependency、DateTime、TimeSpan) 插入重载方法,你可能会注意到插入的缓存项 远早于或晚于指定的 DateTime 过期(过期 时间)。

原因:

System.Web.Caching.Cache 的内部实现使用 绝对到期的协调世界时 (UTC) 时间戳。 但是这个特殊的 Cache.Insert (string, object, CacheDependecy, DateTime, TimeSpan) 插入重载方法并不确定是否 过期时间转换为 UTC。因此,到期 使用此重载插入到 Cache 对象中的项目 将比预期早或晚发生,具体取决于计算机 与格林威治标准时间 (GMT) 的时区差异。

解决方法:

此问题的临时解决方法是使用 Cache.Add 方法或不同的 Cache.Insert 重载方法。

分辨率:

此问题将在 .NET Framework 的下一个版本中修复,并且也将在 .NET Framework 4.7 的下一个修补程序中提供。

参考资料:

https://support.microsoft.com/en-us/help/4035412/fix-expiration-time-issue-when-you-insert-items-by-using-the-cache-ins

http://vimvq1987.com/2017/08/episerver-caching-issue-net-4-7/

【讨论】:

    猜你喜欢
    • 2020-03-02
    • 1970-01-01
    • 2014-02-04
    • 2021-06-11
    • 1970-01-01
    • 2023-03-17
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多