Windows Creator Update

时间:2017-04-14 23:17:20

标签: asp.net-mvc caching

我不确定除了有其他人看到此问题之外我还有其他具体问题吗?如果是这样,是否有已知的解决方法/修复方法?我没有在谷歌上找到关于这个主题的任何内容。

基本上,我们有一个ASP.NET MVC应用程序,我们在localhost上运行,在内存缓存中广泛使用ASP.NET。我们将许多重复的请求缓存到Db。

昨天,我们将两台开发机器升级到了Windows 10 Creators Update。在更新之后,我们注意到仅在这些计算机上的页面请求开始被抓取。每页超过30秒。

经过一些调试和查看日志后,我们发现每个请求系统向Db发出200-300次相同的请求。以前,这只是第一次缓存,并且在缓存过期之前该请求不会再次发生。

我们看到的是这段代码:

var myObject = LoadSomethingFromDb();
HttpRuntime.Cache.Insert("test", myObject);
var test = HttpRuntime.Cache.Get("test");

在某些时候,Get即使在插入代码之后就会返回NULL,即使缓存甚至没有接近满的方式。该应用程序刚刚开始。

还有人看到这个吗?

2 个答案:

答案 0 :(得分:0)

没关系。我们在Absolute Cache Expiration参数中得到了一点,我忽略了它包含在问题的代码中,因为我不认为这是相关的。

我们使用的绝对缓存过期时间为:

DateTime.Now.AddMinutes(60)

相反,我们应该一直在使用:

DateTime.UtcNow.AddMinutes(60)

不确定为什么前者在创建者更新之前在Windows中很好,但是对UtcNow的更改似乎使缓存再次起作用。

答案 1 :(得分:0)

似乎在windows创建者更新后,cache.Insert重载方法的行为表现不同。

        [Test]
    public void CanDemonstrateCacheExpirationInconsistency()
    {
        var cache = HttpRuntime.Cache;
        var now = DateTime.Now;
        var key1 =$"Now{now.Ticks}";
        var key2 = key1+"2";
        var key3 = $"UtcNow{now.Ticks}";
        var key4 = key3 + "2";
        cache.Insert(key1, true, null, DateTime.Now.AddHours(1), Cache.NoSlidingExpiration);
        cache.Insert(key2, true, null, DateTime.Now.AddHours(1), Cache.NoSlidingExpiration,CacheItemPriority.Default,null);
        cache.Insert(key3, true, null, DateTime.UtcNow.AddHours(1), Cache.NoSlidingExpiration);
        cache.Insert(key4, true, null, DateTime.UtcNow.AddHours(1), Cache.NoSlidingExpiration, CacheItemPriority.Default, null);

        Assert.That(cache.Get(key1), Is.Null); //Using this overload with datetime.now expires the cache immediately
        Assert.That(cache.Get(key2), Is.Not.Null);
        Assert.That(cache.Get(key3), Is.Not.Null);
        Assert.That(cache.Get(key4), Is.Not.Null);
    }