2014-05-07 24 views
0

我已經開發了一個Asp.Net MVC Web應用程序並將其部署在IIS 8服務器上,並在我的應用我用一個列表存儲在線用戶,並顯示它們被重置在頁面中使用下面的代碼列表是每天晚上8 IIS服務器

if (HttpRuntime.Cache["LoggedInUsers"] != null) 
       { 
        List<string> loggedInUsers = (List<string>)HttpRuntime.Cache["LoggedInUsers"]; 

        if (loggedInUsers.Contains(model.UserName)) 
        { 
        } 
        else 
        { 
         loggedInUsers.Add(model.UserName); 
         HttpRuntime.Cache["LoggedInUsers"] = loggedInUsers; 
        } 
       } 

出於某種原因,該列表被清除,每天晚上,當我尋找的活躍用戶,我看到了空。

有什麼事情對IIS 8予以處理或者是有使用數據庫表可實現在線用戶沒有更好的辦法..

+2

如果你想堅持的列表,從應用程序池回收,代碼更新,服務器故障,等等 - 你應該保存這個在本地文本或XML文件或一個簡單的數據庫表。此列表在內存中 - 它不會持續通過任何應用程序重新啓動(不管原因) – Tommy

回答

5

IIS可以回收您的應用程序池(有幾個原因,其中包括空轉且沒有要求,太多的記憶使用等...)在這一點上你的應用程序將被卸載,然後再次加載。因此你的緩存值已經消失了。

其次,你有什麼代碼,在某些時候李子和從緩存中刪除舊的條目?如果沒有,這意味着你有內存泄漏,因爲它會繼續無限增長(從而觸發應用程序池回收)。

如果你確實有P運轉代碼(所以緩存積極管理,以避免不確定的增長),你需要它的內容生存過去池重新啓動,那麼你有幾種選擇:

  • 使用數據庫。只需擁有一個活躍用戶的表格並在其中添加/刪除。
    • 臨:生存甚至意外崩潰應用程序,IIS,甚至是機器本身。
    • Con:由於db訪問和db爭用點的可能性而變慢。
  • 將代碼放入您的應用程序開始/結束事件處理程序中,以將內容序列化到文件上,並在開始時反序列化。
    • Pro:比db快。在優雅的關機期間工作。
    • Con:由於意外崩潰而無法工作。
+1

+1,'Cache'不適用於持久性存儲。 – David

0

您的網站可能在一定時間後關閉沒有活動。看看應用程序池的IIS設置(更具體的「設置空閒超時在IIS中從來沒有」)對谷歌...

+1

我認爲你有正確的答案,但缺乏對此答案的努力量。而不是告訴某人Google,推斷什麼是空閒超時,應用程序池回收,然後鏈接到顯示如何控制此設置的站點(例如MSDN,IIS.net)。 – Tommy

+0

謝謝,我將在未來嘗試這個...即使它是正確的答案;) – MaxOvrdrv

相關問題