【发布时间】: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 后遇到了同样的问题