2012-02-27 44 views
2

有人可以給我一個很好的理由爲什麼ViewState默認不存儲在服務器上?默認情況下,爲什麼ViewState不存儲在服務器上?

爲什麼不發送一個小會話令牌來代替ViewState,然後它可以映射到服務器上需要的任何ViewState信息,以防止整個ViewState被多次回發和轉發。

我錯過了什麼嗎?

回答

2

將ViewState存儲在內存中有許多問題。

  1. 如果應用程序回收,所有使用該應用程序的任何人的VS都會丟失。

  2. 它增加了應用程序的內存消耗。如果服務器上只有少數應用程序託管,則這不是問題;但有些情況下可能會在一個盒子上託管許多網站。

  3. 可擴展性;應用程序越活躍,需要存儲的VS就越多。你不能假設1-1(1個用戶 - 1 VS)。用戶可以打開多個選項卡,可以返回,使選項卡處於非活動狀態等等,這會導致:

  4. 您存儲VS多長時間?保持頁面上編碼的數據可以確保在用戶離開網站一段時間後它仍然在那裏。

  5. 如果您在Web場中託管,會發生什麼情況。我們無法保證用戶每次請求都會碰到同一臺機器。

話雖這麼說,有幾個解決方案:

Memcached-Viewstate - 存儲VS在分佈式內存使用內存緩存。這並不理想 - 如果一臺服務器關閉了VS,任何VS存儲到該服務器的用戶都將丟失,但將允許應用程序池重置,而不會出現問題。

SQL-Viewstate - 將VS存儲在SQL數據庫中。這會爲每個請求添加至少1個DB讀取和1個DB寫入。同樣,這並不理想,但是如果VS變得難以獲取,並且從數據庫設置VS比通過HTTP發送和接收更快。

Filesystem-Viewstate - 將VS存儲在文件系統中。它比SQL連接更便宜,但需要文件服務器在分佈式環境中工作。

4

可伸縮性 - 想象一下,如果1M用戶查看複雜的WebForms頁面,將需要多少服務器資源。服務器至少需要在會話超時期間持有ViewState。視圖狀態的自動服務器端清除也會產生問題 - 用戶可能一次查看多個頁面,因此所有頁面的ViewState都需要保留。

編輯 有關於如何視圖狀態移動到服務器中these posts討論的幾種技術。但是,在這樣做之前,從不需要它的控件/頁面中刪除不必要的viewstate是一個好主意(例如,僅查看/無回發呈現)。

我在猜測,但是當viewstate被設計爲10年前,32位服務器上的1GB內存大概和它一樣好,而且MS大概不得不考慮託管提供商想要加載100多個應用程序每臺服務器。所以帶寬可能比服務器Ram和磁盤存儲更便宜。

+0

我會想,如果ViewState足夠大,導致服務器內存問題(即使對於許多用戶),那麼它會大到不應該通過HTTP發送? – Flash 2012-02-27 04:49:47

+0

ViewState是每頁'實例'服務。因此,即使每頁只有10kB,x 1M的用戶,並且每個用戶都有3個頁面打開,我們正在尋找服務器上的30GB ram或磁盤。 – StuartLC 2012-02-27 04:53:00

+0

儘管有100萬併發用戶是非常多的 - 任何應對這種情況的服務器在任何情況下都需要大量的內存。 – Flash 2012-02-27 05:01:10

0

它提高了可伸縮性,因爲服務器不需要在內存中保留所有內容。可以在會話中存儲視圖狀態,但通常不推薦。

0

根本原因是使用客戶端視圖狀態是服務器不知道頁面的當前狀態。

如果用戶感到焦慮,在頁面上進行多個(部分)回發,而不等待響應,瀏覽器將發出多個部分回發請求,即每個請求在服務器端創建一個新的視圖狀態,最終會刷新瀏覽器中的初始視圖狀態。最後用戶做了他最後一次回發,當時,初始副本不見了,因此引發異常。

服務器端視圖狀態也會影響服務器性能和用戶體驗。如果用戶一天或一段時間沒有與該頁面進行交互,則服務器上的視圖狀態將過期。當用戶稍後回發頁面時,會引發異常。

比如我看長度40分鐘的youtube視頻。昨天我看了上半場,沒有關閉標籤,但是嘲笑我的電腦。今天我繼續關注後半部分,並回傳一些內容,如果視圖狀態在服務器中並且過期,頁面將會出錯。

相關問題