2009-08-11 29 views
1

我有一個運行在服務器場中的asp.net應用程序。所以進程內會議已經結束。沒有狀態服務器。有一個sql server數據庫(不能用於狀態服務器)。沒有強制相同的Web服務器服務能力,因此不能保證哪個Web服務器將服務下一頁。需要在ASP.NET網頁刷新頁面間保存數據塊,而不使用inprpc或狀態服務器

我需要在頁面之間保存一塊數據(大對象狀態)。我不想使用viewstate,因爲數據可能很大,並且不希望它通過網絡。 我可以使用數據庫來保存數據,並在視圖狀態中使用記錄標識並檢索下一頁的數據。

有更好的解決方案嗎?

回答

1

嗯,我猜你已經排除了大部分選項。假設您無法安裝其他服務,則可以想到另外兩種可能性:

  1. 使用可寫文件共享來存儲數據。
  2. 允許各個Web服務器相互通信。例如,使機器的IP或名稱成爲生成的唯一標識符的一部分;這樣,如果您在回發時到達不同的服務器,該服務器可以調用原始服務器的數據。請注意,如果一臺服務器出現故障(或者ASP.NET進程被回收),那麼所有數據都將丟失。*不管這個問題如何,我希望不會發生這種情況。

就像在SQL Server版本中一樣,不要忘了清理你的數據;在這方面,選項1非常類似於SQL Server,但對於SQL Server,它可能僅僅是一個集中清理工作,在文件共享情況下,問題就變成:以哪臺服務器爲中心?

*)當然,您可以嘗試從ASP.NET產生輔助進程。這裏的問題變成:如果該過程有問題會怎樣?默認情況下,您的系統管理員不可管理,除非使其易於管理。

+0

您正在回答他的問題,但我希望大家都清楚這些都是可怕的黑客工作。事實上,你提出的這兩個項目都只是比較常見方法的蹩腳替代品。 (通用文件共享=>通用數據存儲=>數據庫存儲) – 2009-08-11 21:46:17

+0

當然,但是這個人想要選項,而且不可靠的人是不可能的。但是,我並不完全同意共同文件共享=>通用數據存儲=>數據庫存儲。關係數據庫不是匿名BLOB存儲。這與文件共享一樣糟糕。您最好*模擬*您要存儲的數據,但從收集該建議的問題來看,這太遲了。 – Ruben 2009-08-11 21:57:17

+0

是的,當標準程序不可用時,將會採取黑客行爲。這並不意味着黑客行不通。如果採取足夠的預防措施和防禦性編程,它們應該足夠好。 – 2009-09-11 05:56:48

4

我可以使用數據庫來保存 數據,並在視圖狀態使用跨 線記錄ID並檢索 數據的下一個頁面。

您已經消除了所有其他選項。

0

我不確定我讀的是否正確,但是不能使用數據庫存儲asp.net會話嗎?

<sessionState 
     mode="SQLServer" 
     sqlConnectionString="somedb" 
     cookieless="AutoDetect" 
     timeout="20" 
    /> 

您還可以使用某種形式的分佈式緩存解決方案一樣memcached(http://www.danga.com/memcached/,並可能回發之間持久化數據。