var cache = System.Runtime.Caching.MemoryCache.Default;
var luCacheKey = "lu_" + dsName;
var ic = HttpRuntime.Cache.Get(luCacheKey) as ICollection;
if (ic == null) {
来自测试人员
var item = HttpRuntime.Cache.Get("x");
if (item == null)
{
HttpContext.Current.Cache.Insert("x", "test" , null, DateTime.Now.AddHours(1), Cache.NoSlidingExpiration);
Response.Write("added to cache<br>");
}
else {
Response.Write("already in cache");
}
所以,我想知道web.config中是否有一些我可以看到的东西,或者这是预期的IIS表达行为?注意,System.runtime.Caching可以正常工作。
var cache = System.Runtime.Caching.MemoryCache.Default;
var ic = cache[luCacheKey] as ICollection;
if (ic == null)
{
var filterCriteria = new BinaryOperator("LookupGroup", dsName, BinaryOperatorType.Equal);
var lookups = xpoSession.GetClassInfo(typeof(Lookups));
ic = xpoSession.GetObjects(lookups, filterCriteria, new SortingCollection(), 0, 0, false, false);
var cachePolicy = new System.Runtime.Caching.CacheItemPolicy() { AbsoluteExpiration = DateTime.Now + TimeSpan.FromMinutes(30) };
cache.Add(new System.Runtime.Caching.CacheItem(luCacheKey, ic), cachePolicy);
答案 0 :(得分:3)
您错误地将对象添加到缓存中。
而不是DateTime.Now
关注文档并放置DateTime.UtcNow
。这解决了一个常见问题,即您的计算机处于“非零”时区,这会阻止缓存的内部逻辑正确管理您的到期。
来自文档
为了避免本地时间可能出现的问题,例如从标准时间更改为夏令时,请使用UtcNow而不是Now来获取此参数值。
https://msdn.microsoft.com/en-us/library/4y13wyk9(v=vs.110).aspx
答案 1 :(得分:0)
添加更多信息,以了解服务器之间行为可能发生变化的原因。
此行为更改可能是由于在计算机上安装了.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/