2013-03-27 77 views
0

我在Win7 64位。这是一个相当讨厌的问题。下面是重现它的步骤:C#HttpRuntime.Cache

  1. Visual Studio创建一个新的C#Asp.Net项目(我使用VS 2010,如果这个问题不知道)

  2. 在代码背后Default.aspx的,该代码添加到Page_Load方法

    HttpRuntime.Cache.Insert("foo", "test", null, DateTime.Now.AddMinutes(30), TimeSpan.FromMinutes(0)); 
    
    string p = "var retval; retval = window.showModalDialog('Test.aspx','', 'dialogHeight:100px; dialogWidth: 100px;scroll: no;center: Yes; help: No; resizable: yes; status: no; unadorned: yes;');"; 
    ScriptManager.RegisterStartupScript(this, GetType(), "openpop", p, true); 
    
  3. 添加另一个名为Test.aspx的Web窗体。你可以把任何你想要的标记放进去,这并不重要。

  4. 在Test.aspx后面的代码中,将这一行放在Page_Load方法中,并在其上设置一个断点。

    string x = (string)HttpRuntime.Cache["foo"]; 
    
  5. 在项目属性中,确保应用程序设置为使用本地IIS Web服务器运行。

当您运行该项目并且它遇到了断点时,再多一步让它分配x,然后x的值将为空。至少这就是发生在我身上的事情。我不明白为什么会发生这种情况,因为值应该仍然在缓存中。在我真正的应用程序中,我还为HttpRuntime.Cache.Insert添加了一个回调函数,以跟踪项目不在缓存中的原因,并说它已过期。但是如果我给它30分钟的绝对到期时间窗口,它怎么会过期?有趣的是,如果使用Visual Studio Development Server而不是IIS来运行应用程序,则该值存在于缓存中!

+0

这是您的答案吗? http://stackoverflow.com/questions/1792972/c-sharp-httpruntime-cache-insert-not-holding-cached-value – Pete 2013-03-27 16:18:08

+0

@皮特 - 不,如我所说,我添加了回调,看看为什么该项目是从缓存中删除,但它说已过期,这是没有意义的,因为它有30分钟的绝对过期窗口。 – dcp 2013-03-27 16:20:43

+0

它可能是DST问题吗?尝试使用'DateTime.UtcNow.AddMinutes(30)'代替。 – 2013-03-27 16:41:57

回答

4

我对这样的设置没有任何问题,但你确实如此。所以我认为这个问题在你使用的DateTime.Now设置中。根据msdn:

插入对象到期并从缓存中删除的时间。为避免本地时间可能出现的问题,例如从标准时间到夏令时间的更改,请使用UtcNow而不是现在对于此参数值为。如果使用绝对过期,slidingExpiration参数必须为NoSlidingExpiration。

那么试试这个:

HttpRuntime.Cache.Insert("foo", "test", null, DateTime.UtcNow.AddMinutes(30), TimeSpan.FromMinutes(0)); 
+0

在上面的问题中请参阅我对Richard Deeming的评论。它没有任何区别。不管怎么说,还是要谢谢你。 – dcp 2013-03-28 10:34:28

+0

优秀:) @Lanorkin – 2017-07-11 21:25:22

相关问题