2012-02-28 100 views
2

相當於我有一個現有的網絡形式的網站,網頁農場上運行(多臺Web服務器,每個請求是無粘性)。ASP.NET MVC - 什麼是ViewState的

其中一項任務是從第三方Web服務中檢索大量數據。這是一個昂貴的過程(就應對時間而言)。最佳的解決方案是首先獲取所有數據並將其粘貼到頁面的ViewState中(作爲列表<產品>。然後我們有一個網格允許我們瀏覽該列表的產品。對於下一頁的每個請求,我們因爲我們已經在ViewState中緩存了數據,所以不需要重新訪問緩慢的Web服務。

那麼,如何使用MVC來實現這一點?如果我使用的是經典ASP,我會序列化列表並在形式的隱藏字段持有它。

但是使用MVC時,首選的方法?如前所述,我使用的非粘性會話,以便在服務器上不能依靠緩存。

如果我要將它放在隱藏字段中,那麼首先壓縮數據(zip)以減少頁面大小是否明智?再一次,這裏的「最佳實踐」是什麼?

任何非常感謝/所有建議

格里夫

PS - 我知道有類似的帖子在那裏(例如ASP.NET MVC and ViewState),但他們不太提供我所需要的細節。

+2

即使在傳統的ASP.NET中,您也不應該將所有這些垃圾都粘貼到每次往返 - 這就是會話變量的優點。如果你不喜歡這個,只需在服務器端使用任何其他數據緩存策略。 – Carsten 2012-02-28 10:54:30

回答

3

呦我們的策略應該取決於從第三方服務檢索到的數據的變化程度以及調用它的成本。

  • 揮發性和昂貴的。我會去倒在分佈式緩存如AppFabric的速度,或Memcached的緩存數據的路。
  • 非揮發性和昂貴的。在每個服務器節點的內存中緩存一份它的副本。
  • 便宜。每次需要時打電話。不要打擾緩存。

如果從服務返回的數據集很大,我不會每次通過網格數據頁面時都傳遞這個數據。只檢索當前頁面的數據並將其呈現在網格中。 Telerik對此有一個很好的實現,或者你可以嘗試和推出自己的。

4

緩存,在我的愚見,是處理這個問題的最好方法;點擊webservice,緩存數據,並將其用於每個後續請求。

可能跨多個Web服務器共享緩存。默認行爲是將其保持進程內,但是這是由沒有固定的手段,並且可以被配置以將其存儲在遠程高速緩存是InProc,數據庫,或半持續存儲的任何其它方法。 Azure 想到AppFabric緩存。

二到,正如你提到的是轉儲在一個隱藏字段中的所有數據,但我不喜歡這個主意

  • 頁面膨脹有很多原因 - 你提交這些數據每一次頁面變更
  • 丟失的數據 - 你必須提交一個表單在每個導航,忘記做這意味着失去您的數據

要命名2.

+0

+1用於緩存。 – 2012-02-28 11:18:57

+0

微軟服務器AppFabric有一個緩存,我正在使用這個用例。 – linkerro 2012-02-28 11:28:27

+0

@linkerro - 這就是我的腦海裏,但由於某種原因輸入「Azure」。名字在某處變了嗎? – Jamiec 2012-02-28 11:31:52