簡體   English   中英

頁面刷新后HttpContext.Current.Cache項為null

[英]HttpContext.Current.Cache item null after page refresh

我有一個C#網頁,我在其中使用HttpContext.Current.Cache在服務器緩存中存儲List <>對象。 第一頁加載后,對象將保存在緩存中。 當我刷新頁面時,緩存對象為空。 有什么想法嗎?

另外,我想設置一個“工作”來每30分鍾重新創建一個對象。 我想在創建新版本之前提供緩存版本,然后用新版本替換舊版本。 我怎么做?

在我的Global.asax中,在Application_Start中,我有以下內容:

HttpRuntime.Cache.Insert("MainADList", Uf.GetUsers(), null, Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(30));

當我需要它時,我會做以下事情:

 MainADList = (Users)HttpRuntime.Cache["MainADList"];

其中大部分是null。 不總是,但幾乎總是。

即使使用Cache.NoAbsoluteExpiration + Cache.NoSlidingExpiration填充緩存,ASP.NET也可以從緩存中刪除項目(即:當空閑系統內存不足時)。

CacheItemPriority.NotRemovable傳遞給Cache.Insert()以防止發生這種情況。 在MSDN上查找CachéItemPriority。

通過長時間空閑,web.config /二進制更改等重新啟動IIS應用程序池也將擦除您的緩存。 檢查其他SO帖子,HttpRuntime.Cache.Insert()不保存緩存值

關於創建作業以刷新緩存; 我認為最好的Cache策略沒有經驗法則。 它將在很大程度上取決於您的用戶與您的網頁的交互方式,頻率,並發時間,以及特別是在未達到緩存時生成數據所需的時間。

如果生成數據所花費的時間對於任何用戶都是不可接受的,則可以設置刷新緩存的作業,但其間隔應小於生成/檢索所采用的緩存TTL +時間的總和。 例如,如果您的緩存為30米並且生成數據需要2米,則刷新間隔必須為28米或更短,以避免任何用戶點擊空緩存。

你可以使用System.Runtime.Caching 這樣你就不依賴於HttpRuntime命名空間了。

我懷疑你是因為網絡服務器重啟而.Net正在清除它。 做一些事情會更好嗎?

    public List<User> GetUsers()
    {
        var cache = System.Runtime.Caching.MemoryCache.Default;
        if (cache["MainADList"] == null)
        {
            // Rebuild cache. Perhaps for Multithreading, you can do object locking
            var cachePolicy = new System.Runtime.Caching.CacheItemPolicy() { AbsoluteExpiration = DateTime.Now + TimeSpan.FromMinutes(30) };
            var users = Uf.GetUsers();
            cache.Add(new System.Runtime.Caching.CacheItem("MainADList", users), cachePolicy);

            return users;
        }

        return cache["MainADList"] as List<User>; 
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM