化惡魔為天使,巧移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
- 天使還是惡魔?面對紛沓而來的投資,遊戲人該怎麼選擇?遊戲
- SQLSERVER遷移資料至ORACLE軟體下載SQLServerOracle
- Datax助力輕鬆遷移SQLServer資料至GreatSQLSQLServer
- ViewStateView
- 銀河惡魔城入門指南
- 類銀河惡魔城——角色操作
- 如何設計“銀河惡魔城”遊戲遊戲
- 禁用ViewStateView
- “魔”式為王:贏在移動網際網路時代
- 《暗影火炬城》:做一款現代化的銀河惡魔城遊戲遊戲
- C# ViewStateC#View
- 聲名顯赫為何慘遭雪藏?淺談《惡魔城》系列沉淪原因
- 將Excel的資料更新至SqlServerExcelSQLServer
- 企業SaaS服務平臺“魔學院”獲千萬級天使輪融資
- H5遊戲開發:惡魔抽卡 (新)H5遊戲開發
- 惡魔化身:新型勒索BlackMatter Windows和Linux通吃WindowsLinux
- ViewState靈活運用View
- ViewState Session Static區別ViewSession
- 遷移sqlserver資料到MongoDbSQLServerMongoDB
- 遷移部落格至掘金
- SQLServer移動資料檔案SQLServer
- 【遷移】SqlServer 遷移到 MySQL 方法ServerMySql
- 類銀河惡魔城和類魂的區別是什麼?
- 銀河惡魔城設計——鏡頭設計和美術設計
- TrendForce:印度疫情惡化,2021年智慧手機年成長幅度將收斂至8.5%
- 雲視訊會議軟體Zoom深陷信任危機,連曝漏洞或將淪為黑客“惡魔之眼”OOM黑客
- 質量升級 最佳化為先 《魔域手遊2》著力最佳化遊戲效能遊戲
- 《赤痕:夜之儀式》:當《惡魔城》在眾籌平臺上重生
- 《LUCID》:一款“類蔚藍銀河惡魔城”遊戲的開發故事遊戲
- 彈幕類銀河惡魔城《TEVI》於今日正式上線STEAM與Switch!
- 命懸一線的決鬥,祝你好運! - 《惡魔輪盤》產品分析
- 禁止ViewState的3種解決方法View
- 巧學vuexVue
- 巧談 GCDGC
- 巧談GCDGC
- SqlServer時間格式化SQLServer
- 收割怪物靈魂 國產動作遊戲《惡魔反擊戰》商店頁面公開遊戲