iisExpress本地httpruntime.cache始终为null

时间:2017-07-22 13:45:50

标签: asp.net caching iis-express httpruntime.cache

这里有个奇怪的问题。在asp.net webforms(4.5 / 4.7)的本地开发中,我发现即使正确设置,httpruntime.Cache也始终为null。我在另一个iis express工作站上尝试了它,并发现了相同的行为,即使使用测试人员单页网页也是如此。生产IIS 7.5中的同一页面工作,并从缓存中存储和传递。代码具体如下,但我已经尝试过在httpruntime.Cache中存储一个简单字符串的测试人员。

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);

2 个答案:

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

参考文献:

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/