Cache.Insert(""),其绝对到期时间为UTC偏移量

时间:2017-06-28 14:44:15

标签: asp.net caching

我在生产服务器上有一些突然出现缓存问题的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可能无法识别,或者某处有错误的配置值?

1 个答案:

答案 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的下一个修补程序中提供。

参考文献:

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/