(發文后記:還是說清楚前提吧,本文只適用于當不得已才使用ViewState的情況) ViewState 一直以來備受爭議,主要是因為他臃腫的體積,導致客戶的的回傳( PostBack )數據量很大,而其中真正有用的數據又很少,網絡帶寬被浪費不說,用戶的體驗也很差。 最近
(發文后記:還是說清楚前提吧,本文只適用于當不得已才使用ViewState的情況)
ViewState一直以來備受爭議,主要是因為他臃腫的體積,導致客戶的的回傳(PostBack)數據量很大,而其中真正有用的數據又很少,網絡帶寬被浪費不說,用戶的體驗也很差。
最近項目中用到了Telerik的RadGrid,使用服務器端綁定數據后頁面ViewState體積過大,而導致性能嚴重降低,便開始找尋優化方式,盡量將ViewState存在服務器端。
由于項目已開發至中期,不可能做類似于取消ViewState或使用客戶端綁定之類的大規模改動。
要想改動量最小化,肯定不能影響原有ViewState的使用,那只能重寫Page類的LoadPageStateFromPersistenceMedium()和SavePageStateToPersistenceMedium(object state)的方法,在這兩個Override的方法中把數據存在別的什么地方。
這時候就來問題了,ViewState只是一個頁面的周期,每打開一個頁面都會生成一個新的ViewState,連刷新都不例外,如果存在文件或數據庫中,這些數據累積起來可不是開玩笑的,而且也用不上了,那還不得要寫過期刪除的方法么?太麻煩了。這時候,Session就發揮大作用了,Session的生命周期長于ViewState,過期會自動刪除,而且還是存在服務器端的,不會增加數據傳輸量,看來很合適。
代碼如下:
Code
public class AmoPage: System.Web.UI.Page
{
#region === Move View State To Session ===
private string _pageGuid = null;
public string PageGUID
{
get
{
if (_pageGuid == null)
_pageGuid = this.Request.Form["__AmoViewState"];
if (_pageGuid == null)
_pageGuid = Guid.NewGuid().ToString();
return _pageGuid;
}
set { _pageGuid = value; }
}
protected override object LoadPageStateFromPersistenceMedium()
{
return Session[this.PageGUID];
}
protected override void SavePageStateToPersistenceMedium(object state)
{
RegisterHiddenField("__AmoViewState", this.PageGUID);
Session[this.PageGUID] = state;
}
#endregion
}
但是不能忽略一個問題,Session默認是由WebServer 管理的,一般只用于存儲會話中用戶登錄信息這種數據量極小的情況,如果直接把ViewState這個大胖子塞進去,全部是保存在內存中的,無疑用不了多長時間,WebServer就會因為Session數據量過大而崩潰。看來我們還需要轉移Session。
正好,ASP.NET支持自定義會話管理的方式:
開始-> All Programs-> Microsoft Visual Studio 2008->Visual Studio Tools->Visual Studio 2008 Command Prompt
進入VS命令行模式。
執行 aspnet_regsql –S (192.168.19.250) –U sa –P 123 –ssadd
這是指使用用戶名sa 密碼123登錄到SQLServer服務器192.168.19.250上添加狀態管理相關的數據庫。其實它是建立了一個只有出口存儲過程的數據庫ASPState,并在系統數據庫tempdb中加入了兩張分別用于存儲Application 和Session的表。
這時候我們就完成了狀態管理相關的數據庫的創建,然后只要在 Web.config中做如下設置即可
這時候,該Web應用的Session數據就會存儲于數據庫中。
在使用的時候,只要將原有的頁面都從AmoPage類繼承就行。
至于效果,試過就知道!
使用前:(很熟悉吧...)
使用后:(干凈,清透,沒問題!)
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com