2012-06-05 56 views
1

我知道一個靜態成員將被ASP.NET網站的所有用戶共享;但在這個特殊情況下 - 這正是我想要的。在ASP.NET網站中使用靜態成員是不好的做法嗎?

這是一個私人用途的網頁,我把它們放在一起,以促進兩個用戶之間基於網絡的聊天。我想避免將數據保存到數據庫或數據文件,並認爲我可以將最新的X消息存儲在靜態併發隊列中。這似乎在我的開發機器上工作得很好。

我對ASP.NET很不熟悉,但在所有我發現的例子中,都沒有使用這種方法。這是不好的做法,是否有'我應該知道的陷阱'?我可以看到的另一種方法是使用數據庫。但我覺得這樣做會更加努力,而且我的猜測是更多的資源(我認爲我的'緩衝區'消息將需要大約40kb的內存,並且可以節省數據庫的相當一部分時間)。

回答

2

只要你的要求沒有改變,你就可以隨意丟失服務器端的所有消息,這是非常好的。

我會稍微重構代碼以提供「消息存儲」接口,以簡化代碼的測試(如果您決定使代碼更復雜/持久/多用戶,將來可能帶來益處)。靜態存儲方式(或HttpApplicationState)的

臨:

  • 與服務器端存儲的消息沒有任何問題 - 更少的隱私擔憂。沒有東西是永久存儲的,所以你可以說任何你想要的。
  • 極其簡單的實現。
  • 適合即時通訊/電話交談。
  • 不太可能在單個服務器情況下

缺點性能問題:

  • 的消息可能會丟失。可以通過在客戶端上存儲歷史來緩解(例如,在同一網頁上檢索帶有AJAX查詢的消息)
  • 如果數據在涉及更多用戶時敏感/或者應用與其他一些代碼共享,則需要更多的關注,因爲靜態數據是對每個人都可見。也沒有太大的不同,從任何其他存儲。
  • 無法直接遷移到多個服務器/網絡場景場景。真的不太可能發生2人聊天服務器問題。
+0

真的很喜歡這個優點/缺點 - 謝謝 –

8

假設你確定整個事情都是線程安全的,那就行了。

但是,IIS可以隨時回收您的AppDomain,所以當您不期待它時,您的隊列可能會被吹走。

+1

另外,您只能停留在一臺服務器上 - 內存中的隊列無法真正在機器間共享。 –

+1

+1。 @ChrisShain,需要非常嘮叨,需要多個服務器與另一個人進行一對一的聊天:) –

3

即使IIS不會刷新並偶爾重新啓動您的AppDomain,爲此目的使用靜態變量聽起來像是一個臭ha ha的黑客。

HttpApplicationState類提供對可用於存儲信息的應用程序範圍內緩存的訪問。

ASP.NET Application State Overview

相關問題