我在生产服务器上有一些突然出现缓存问题的asp.net webforms网站。问题是我的缓存值在使用Cache.Insert方法时不会持久存在。使用Cache [" key"] = value仍然有用。
例如,当我设置这样的值时,检索它时它为空。
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可能无法识别,或者某处有错误的配置值?
答案 0 :(得分:4)
此行为更改可能是由于在计算机上安装了.NET 4.7。下面链接的文章说微软将在下一版本的.NET和下一个修补程序中解决这个问题。
引用Microsoft页面的部分内容:
症状:
假设您安装了Microsoft .NET Framework 4.7 电脑。当您尝试使用时将项目插入到Cache对象中 Cache.Insert(string,object,CacheDependency,DateTime,TimeSpan) 插入重载方法,您可能会注意到插入的Cache项 比指定的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的下一个修补程序中提供。
参考文献:
http://vimvq1987.com/2017/08/episerver-caching-issue-net-4-7/