3

这里奇怪的问题。在 asp.net webforms (4.5 / 4.7) 的本地开发中,我发现 httpruntime.Cache 始终为空,即使设置正确也是如此。我在另一个 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);
4

2 回答 2

5

您错误地将对象添加到缓存中。

而不是DateTime.Now遵循文档并放置DateTime.UtcNow. 这解决了一个常见问题,即您的机器处于“非零”时区,这会阻止缓存的内部逻辑正确管理您的过期时间。

从文档

为避免本地时间可能出现的问题,例如从标准时间更改为夏令时,请将此参数值使用 UtcNow 而不是 Now。

https://msdn.microsoft.com/en-us/library/4y13wyk9(v=vs.110).aspx

于 2017-07-22T14:09:18.617 回答
0

添加更多信息以跟进服务器之间行为可能发生变化的原因。

这种行为变化可能是由于在计算机上安装了 .NET 4.7 造成的。下面链接的文章说,Microsoft 将在 .NET 的下一版本和下一个修补程序中修复此问题。

引用微软页面的部分内容:

症状:

假设您在计算机上安装了 Microsoft .NET Framework 4.7。当您尝试使用 Cache.Insert (string, object, CacheDependency, DateTime, TimeSpan) Insert 重载方法将项插入到 Cache 对象中时,您可能会注意到插入的 Cache 项的过期时间远早于或晚于指定的 DateTime (expiration时间)。

原因:

System.Web.Caching.Cache 的内部实现使用协调世界时 (UTC) 时间戳来实现绝对过期。但是这个特定的 Cache.Insert(string, object, CacheDependecy, DateTime, TimeSpan) Insert 重载方法并不能确定过期时间是否转换为 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/

于 2017-08-11T20:36:07.670 回答