2012-10-09 82 views
0

我想有一個「用戶消息」可用於每個請求由服務器發回。如果沒有用戶消息,則消息將變回空白。如果有,則在請求完成後,在每個用戶屏幕上激活一個圖標。c#.net內存中的持久性

「用戶消息」是由管理員爲我正在部署的應用程序設置的。管理員可以在字段中輸入文本,然後單擊按鈕將此消息發送給系統的其他用戶。任何時候,其他用戶執行任何類型的操作時,當前用戶消息都會附加到JSON響應並由前端處理。

爲了優化這個,我希望郵件被存儲在內存(不在數據庫中)

我試過使用靜態。我試圖使用HttpApplicationState。在這兩種情況下,用戶消息的值在一段時間後都會「消失」。經過一番研究,似乎靜態和HttpApplicationState都受到IIS的約束,並且它決定回收應用程序池。 (或類似)

靜態這個波動神祕:它應該是靜態 - 只要IIS自己的生命,這個變量應該活。它不應該依賴某種「重置」或任何其他。 HttpApplicationState是我不完全理解的其他一些情況。

我想要一種方法來將值存儲在我可以依賴的非易失性變量中。如果我今天設置了這個值,那麼只要IIS未停止並重新啓動,它應該在明天或下個星期。

任何幫助?


這裏是我做了什麼來解決這個問題按照下面的接受的答案:

  1. 用戶消息是某個東西。因此當某個管理員設置了該消息時,將該響應存儲在該時間點的數據庫中,並將其存儲在Application [「UserMessage」]對象中。
  2. 當來自用戶的往返進入時,用戶消息的內存中文本被添加到json返回值中。
  3. 消息可以隨時由管理員清除,這將清除內存中的消息和數據庫字段。
  4. 當IIS決定足夠的時間並且回收應用程序時,Application_Start()方法(以及其他任務)也會將用戶消息從設置了用戶消息時存儲的數據庫值中重新排序(按照步驟1 )。

現在應用程序按預期工作。沒有額外的價格支付到數據庫爲每個用戶請求進入系統 - 用戶消息總是來自內存。除此之外,數據庫更新或加載用戶消息的次數很少。

+0

看到我的回答,你可以使用application_start來恢復變量,如果它從內存中被銷燬。這隻發生在IIS回收您的應用程序時。 –

+0

謝謝喀布爾,我已根據您的回覆更新了原始問題以闡明我的請求。抱歉的渾濁.. – horace

+0

你總是可以把消息放在應用程序緩存中,也可以放在數據庫中。當第一次管理員發送消息時,你需要做的是把它放在數據庫和應用程序緩存中。您的代碼將始終從應用程序緩存中發送消息,但由於應用程序緩存將在應用程序重新啓動後失效,因此您需要從application_start上的數據庫中重新加載它。 –

回答

1

應用程序緩存是一個很好的地方。你的問題是,你認爲你不能依靠它。請參閱我的答案的後面部分,在那裏你會發現如何確保在iis重新啓動或iis回收您的應用程序後,該值始終存在。

您可以將值存儲在應用程序緩存中。這是可以做到如下

Application.Add(name,object) 

稍後,您可以通過使用此代碼

Application[name] 

它是這樣工作會議,但唯一的區別在於它是應用廣泛,所有的請求從每個請求檢索所有用戶都會得到它。當您第一次分配設置值時,將其存儲在數據庫以及應用程序緩存中,以便稍後可以從數據庫中進行查詢並將其存儲在應用程序緩存中(如果值不存在),然後從應用程序緩存中檢索它。

您應該從每次應用程序啓動或重新啓動時觸發的Application_Start()事件的數據庫中恢復應用程序緩存。這樣你可以確保它總是在應用程序緩存中。

+0

但該解決方案要求application_start()*知道*啓動時的值。這個值是任意的。我原來的帖子並不完全清楚,所以我已經編輯澄清。 – horace

+0

如果你想在這個時候把價值放好,這取決於你。你能否澄清一下,你是什麼意思的武斷?在某個時間點,您必須知道將其存儲在某處的價值。 –

+0

由任意,我的意思是任意的。有人坐在應用程序中,鍵入一個值,它以某種方式存儲在服務器上 - 希望在內存中。該值不是在application_start()中預先確定的,而是在該時間點之後的某個時間動態生成的。請參閱下面的答案,瞭解如何使用持久性和應用程序對象來解決問題。 – horace

1

我想要一種方法將值存儲在一個非易失性變量,我 可以依靠。如果我今天設置這個值,那麼明天應該在那裏, 或下週,只要IIS沒有停止並重新啓動。

在這種情況下,您不能將此值存儲在內存中。內存是IIS爲您分配的東西,用於承載應用程序的AppDomain。 IIS可以隨時回收您的應用程序並清除內存。當IIS繼續運行時,您的應用程序不會運行。所以你不能依靠它。在這種情況下,唯一可靠的解決方案是將這些信息保存在一些非易失性存儲中,例如文件,數據庫等......這個選擇真的取決於您,但它應該超出您AppDomain的過程。

+0

後續問題:有什麼方法可以知道iis即將回收我的應用程序嗎?我不想這樣做,但這是我不想打數據庫.. – horace

+0

不,沒有辦法。 IIS可以隨時回收您的應用程序。例如,如果您的應用程序遇到一些CPU或內存使用閾值。唯一可靠的解決方案是進程外持久性。 –