化惡魔為天使,巧移ViewState至SqlServer
ViewState一直以來備受爭議,主要是因為他臃腫的體積,導致客戶的的回傳(PostBack)資料量很大,而其中真正有用的資料又很少,網路頻寬被浪費不說,使用者的體驗也很差。
最近專案中用到了Telerik的RadGrid,使用伺服器端繫結資料後頁面ViewState體積過大,而導致效能嚴重降低,便開始找尋優化方式,儘量將ViewState存在服務器端。
由於專案已開發至中期,不可能做類似於取消ViewState或使用客戶端繫結之類的大規模改動。
要想改動量最小化,肯定不能影響原有ViewState的使用,那隻能重寫Page類的LoadPageStateFromPersistenceMedium()和SavePageStateToPersistenceMedium(object state)的方法,在這兩個Override的方法中把資料存在別的什麼地方。
這時候就來問題了,ViewState只是一個頁面的週期,每開啟一個頁面都會生成一個新的ViewState,連重新整理都不例外,如果存在檔案或資料庫中,這些資料累積起來可不是開玩笑的,而且也用不上了,那還不得要寫過期刪除的方法麼?太麻煩了。這時候,Session就發揮大作用了,Session的生命週期長於ViewState,過期會自動刪除,而且還是存在伺服器端的,不會增加資料傳輸量,看來很合適。
程式碼如下:
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中做如下設定即可
<sessionState mode="SQLServer" sqlConnectionString="Data Source=192.168.19.250;User ID=sa;Password=123;">sessionState>
system.web>
這時候,該Web應用的Session資料就會儲存於資料庫中。
在使用的時候,只要將原有的頁面都從AmoPage類繼承就行。
至於效果,試過就知道!
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-609988/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 借款人:錢站既是天使,也是惡魔
- eBPF 雙子座:天使 or 惡魔?| 龍蜥技術eBPF
- 天使 OR 惡魔,NFT會否撐起Metaverse經濟體系?Metaverse
- Datax助力輕鬆遷移SQLServer資料至GreatSQLSQLServer
- 天使還是惡魔?面對紛沓而來的投資,遊戲人該怎麼選擇?遊戲
- C# ViewStateC#View
- FC《惡魔城》系列追憶
- 類銀河惡魔城——角色操作
- 銀河惡魔城入門指南
- “箱庭”——《只狼》中的“惡魔城”
- 如何設計“銀河惡魔城”遊戲遊戲
- 惡魔化身:新型勒索BlackMatter Windows和Linux通吃WindowsLinux
- 遷移sqlserver資料到MongoDbSQLServerMongoDB
- 聲名顯赫為何慘遭雪藏?淺談《惡魔城》系列沉淪原因
- 《暗影火炬城》:做一款現代化的銀河惡魔城遊戲遊戲
- 水銀蒸汽的崛起(上):左擁惡魔城
- SQLServer移動資料檔案SQLServer
- 【遷移】SqlServer 遷移到 MySQL 方法ServerMySql
- 《惡魔之魂 重製版》的簡中本地化文字是如何誕生的?
- H5遊戲開發:惡魔抽卡 (新)H5遊戲開發
- TrendForce:印度疫情惡化,2021年智慧手機年成長幅度將收斂至8.5%
- SQLServer 2012 AG強制故障轉移SQLServer
- 遷移部落格至掘金
- ASP.NET Web 窗體- 保持 ViewState簡介ASP.NETWebView
- 巧學vuexVue
- 為什麼說過早最佳化是萬惡之源?
- 銀河惡魔城設計——鏡頭設計和美術設計
- 類銀河惡魔城和類魂的區別是什麼?
- 《惡魔之魂》是次時代大門的一條門縫
- 雲視訊會議軟體Zoom深陷信任危機,連曝漏洞或將淪為黑客“惡魔之眼”OOM黑客
- Linux需巧學Linux
- 《血汙》的精神原點:《惡魔城》系列不得不知的那些事
- [SQLServer]NetCore中將SQLServer資料庫備份為Sql指令碼SQLServerNetCore資料庫指令碼
- 彈幕類銀河惡魔城《TEVI》於今日正式上線STEAM與Switch!
- Inti Creates的懷舊之魂(下):復活《惡魔城》的畫素精神
- 《赤痕:夜之儀式》:當《惡魔城》在眾籌平臺上重生
- 命懸一線的決鬥,祝你好運! - 《惡魔輪盤》產品分析
- 百度AutoDL重磅升級至3.0:設計、遷移、適配全面“進化”
- 巧解 JS 原型鏈JS原型