2013-03-27 73 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