【问题标题】:iisExpress local httpruntime.cache always nulliisExpress 本地 httpruntime.cache 始终为空
【发布时间】:2017-12-28 13:03:49
【问题描述】:

这里有一个奇怪的问题。在 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);

【问题讨论】:

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


    【解决方案1】:

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

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

    来自文档

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

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

    【讨论】:

    • 谢谢维克托!就是这样。奇怪的是,它似乎在其他地方工作,但在开发机器上却没有。我现在有很多代码替换要做!再次感谢您的快速回复。代表++
    • 我们的情况正好相反,这在开发机器上就像一个魅力,但在生产中却失败了。花了一天时间找出问题所在。
    【解决方案2】:

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

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

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

    症状:

    假设您在一个计算机上安装了 Microsoft .NET Framework 4.7 计算机。当您尝试通过使用将项目插入 Cache 对象时 Cache.Insert(字符串、对象、CacheDependency、DateTime、TimeSpan) 插入重载方法,你可能会注意到插入的缓存项 远早于或晚于指定的 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/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-31
      • 1970-01-01
      • 2020-05-29
      • 2013-08-18
      • 2016-03-27
      • 2017-07-31
      • 2019-07-18
      • 2019-08-18
      相关资源
      最近更新 更多