ViewState 資料太大影響效能導致頁面報錯
阿新 • • 發佈:2019-02-14
案件背景:
工作中的一個報表之前一直工作正常,但是有一天突然使用者開啟報錯,提示view state 無效。檢查程式碼發現沒有問題,檢查前臺頁面後發現報表顯示後的viewstate大小居然達到40M以上。
通過在頁面增加下面兩個事件的程式碼,把view state 儲存到文字檔案中。可以讓頁面顯示速度大大提高。
VB.NET 版
Protected Overrides Sub SavePageStateToPersistenceMedium(ByVal state As Object) Dim x As New ObjectStateFormatter() Dim value As String = x.Serialize(state) Dim viewStateID As String = DateTime.Now.Ticks + Me.GetHashCode().ToString Dim fn As String = System.IO.Path.Combine(Request.PhysicalApplicationPath, "App_Data/ViewState/" + viewStateID) System.IO.File.WriteAllText(fn, value) Cache.Insert(viewStateID, value) MyBase.SavePageStateToPersistenceMedium(viewStateID) End Sub
Protected Overrides Function LoadPageStateFromPersistenceMedium() As Object Dim viewStateID As String viewStateID = CType(MyBase.LoadPageStateFromPersistenceMedium, Pair).Second.ToString Dim stateStr As String = "" Dim result As New Object If Cache(viewStateID) IsNot Nothing Then stateStr = Cache(viewStateID).ToString() End If If stateStr.ToString.Equals("") = False Then Dim fn As String = System.IO.Path.Combine(Request.PhysicalApplicationPath, "App_Data/ViewState/" + viewStateID) stateStr = System.IO.File.ReadAllText(fn) End If Dim x As New ObjectStateFormatter() If stateStr.Equals("") = False Then result = x.Deserialize(stateStr) End If Return result End Function
C# 版
Protected Overrides Sub SavePageStateToPersistenceMedium(ByVal state As Object) string value = new ObjectStateFormatter().Serialize(state); string viewStateID = (DateTime.Now.Ticks + (long)this.GetHashCode()).ToString(); //產生離散的id號碼 string fn = Path.Combine(this.Request.PhysicalApplicationPath, @"App_Data/ViewState/" + viewStateID); //ThreadPool.QueueUserWorkItem(File.WriteAllText(fn, value)); File.WriteAllText(fn, value); Cache.Insert(viewStateID, value); base.SavePageStateToPersistenceMedium(viewStateID); End Sub