Asp.net

asp.net 頁面中的無效視圖狀態錯誤

  • August 22, 2014

該網頁是一個簡單的註冊類型頁面。每個使用者必須填寫大約 200 個欄位。有 1 個父表和 6 個子表。每個表資訊都顯示在單獨的 AJAX 選項卡面板中,詳細資訊保存在每個選項卡導航中。我在 Intranet 中託管了該網站,同時有 100 個使用者輸入了詳細資訊。最初一切順利,條目被保存在數據庫中,但過了一段時間,顯示了 AJAX 載入圖像,網站看起來很慢。使用者的詳細資訊沒有保存在數據庫中。最後 Firefox 瀏覽器對一些人來說崩潰了,對於一些人來說,應用程序甚至沒有被註銷。網站掛了!我也重置了 IIS,一切都持續了幾分鐘,同樣的問題又開始了!我使用過 NHibernate 框架、AJAX、ASP.Net 4。

以下是日誌文件中的錯誤詳細資訊:

   2014-08-11 10:05:40,953 [22] INFO ASP.global_asax servername :  - 
************************* 11/08/2014 10:05 **************************** IP Address: xx.x.xxx.xx Exception Type: System.Web.HttpException Exception: Request timed out. Source: 
**************************************************************************

   2014-08-11 10:05:40,984 [39] INFO ASP.global_asax servername :  - 
   ************************* 11/08/2014 10:05 ****************************`
   IP Address: xx.x.xxx.xx
   Exception Type: System.Web.HttpException
   Exception: The client disconnected.
   Source: System.Web
   Stack Trace: 
      at System.Web.UI.ViewStateException.ThrowError(Exception inner, String persistedState, String errorPageMessage, Boolean macValidationError)
      at System.Web.UI.ViewStateException.ThrowViewStateError(Exception inner, String persistedState)
      at System.Web.UI.ClientScriptManager.EnsureEventValidationFieldLoaded()
      at System.Web.UI.ClientScriptManager.ValidateEvent(String uniqueId, String argument)
      at System.Web.UI.Control.ValidateEvent(String uniqueID, String eventArgument)
      at System.Web.UI.WebControls.DropDownList.LoadPostData(String postDataKey, NameValueCollection postCollection)
      at System.Web.UI.WebControls.DropDownList.System.Web.UI.IPostBackDataHandler.LoadPostData(String postDataKey, NameValueCollection postCollection)
      at System.Web.UI.Page.ProcessPostData(NameValueCollection postData, Boolean fBeforeLoad)
      at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
      at System.Web.UI.Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
      at System.Web.UI.Page.ProcessRequest()
      at System.Web.UI.Page.ProcessRequestWithNoAssert(HttpContext context)
      at System.Web.UI.Page.ProcessRequest(HttpContext context)
      at ASP.ui_shape_profilereg_aspx.ProcessRequest(HttpContext context)
      at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
      at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

       **************************************************************************

   Inner Exception Type: System.Web.UI.ViewStateException
   Inner Exception: Invalid viewstate. 
       Client IP: xx.x.xx.xx
       Port: 44853
       Referer: mypageurl.aspx
       Path: /xx/xxxx/xxxxx.aspx
       User-Agent: Mozilla/5.0 (X11; Linux i686; rv:17.0) Gecko/20100101 Firefox/17.0
       ViewState: /wEW4xwCvIuN0AIC1tvizQkCq67tpAgC76DRtAcCx+CW8AkCub6h1gwCgL6h1gwC2tGLOAKy2oaCCQLvkqjEDgKhnYMvArnixL8OApuuotUNAvL6+LQMAr6MpOoPArqKsKgDAvHcqZUKAqz10osPAu71uZENAqOa+OUDAtH844kHApLejoMIApLe0pAOAqze2pAOAqze0pAOAqu34bMNAtGFvd4JAq3e2pAOAq3e0pAOAtKFvd4JAqu3pa0NAtGF4dsJAsyRw5MHAsyRu9kFAqu35bMNAtGFod4JAsyRx5MHAsyRv9kFAof0kuQOApj0kuQOAoibuIoCAo/tyqYKAvnF+KIIAunaxagHAuu0gK8OAr+m5s0MAp3r6bkJAp/A0coMAs+s/tsNAseN/JQOApaT7OIDAr/1vroLArWhqYQMAqDH34kLArCo9ecHAsuo0fkHAtCo0fkHAqa0zecNApe1zIMOAofa5u0CApja5u0CApna5u0CApra5u0CApva5u0CApza5u0CAp3a5u0CAp7a5u0CApbxu6IGAoaekcwKApmekcwKApiekcwKApuekcwKApqekcwKAp2ekcwKApyekcwKAp+ekcwKAo6ekcwKAoGekcwKApme0c8KApme3c8KApme2c8KApme5c8KApme4c8KApme7c8KApme6c8KApme9c8KApmescwKApmevcwKApie0c8KApie3c8KApie2c8KApie5c8KApie4c8KApie7c8KApie6c8KApie9c8KApie...
   Inner Source: 
   **************************************************************************

   `2014-08-11 10:05:54,875 [82] INFO ASP.global_asax servername :  - 
   ************************* 11/08/2014 10:05 ****************************
   IP Address: xx.x.xxx.xx
   Exception Type: System.Web.HttpException
   Exception: Request timed out.
   Source: 

   **************************************************************************

這些錯誤在日誌中反復出現。

我曾嘗試增加數據庫大小,但之後沒有進行測試。

我完全被卡住了!請指導如何進行。

以下是我嘗試過的解決方案:

  • 生成特定的機器密鑰和 aAdding enableViewstateMac=“False” 如本文所述此連結中提供了另一篇有用的文章
  • 當頁面內的控制項數量很大時(我們有大約 200 個控制項),maxpagestatefieldlength 屬性應該設置為較小的值,該欄位表示發送到客戶端瀏覽器的視圖狀態分為多個隱藏欄位,每個欄位的值小於 MaxPageStateFieldLength 屬性中指定的大小。我們指定了 maxpagestatefieldlength =“40”
  • 我們已經完成了本文中指定的視圖狀態壓縮。該程式碼壓縮了視圖狀態,從而使網站在低速網際網路連接中也能正常工作!
  • 以下是我們在 web.config 文件 enableEventValidation=“false” viewStateEncryptionMode=“Never” enableViewStateMac=“false” 中添加的標籤。請注意,出於安全原因,enableViewStateMac 設置為 true。MAC 保證客戶端不能惡意篡改 ViewState 的內容。(加密本身不足以保證這一點;MAC 是必需的。)EnableViewStateMac 屬性將在產品的未來版本中刪除,因為沒有正當理由將其設置為“false”。
  • 我們在程式碼中犯的另一個重要錯誤是我們使用應用程序變數將錯誤詳細資訊儲存在日誌中,並將其顯示在錯誤頁面中。由於應用程序變數的使用,當一個客戶端發生錯誤時,應用程序會為其餘客戶端掛起。我們已經刪除了那個應用程序變數並使用了不同的方法進行錯誤處理。我們使用的錯誤處理方法是從這篇文章中獲得的
  • 我們在測試過程中遇到了一個問題。錯誤是“超出最大請求長度”,通過實施本文中給出的建議已修復
  • 我們在我們的網站中使用了一個更新面板,其中添加了 AJAX 選項卡容器。現在我們已經移除了更新面板,並在每個選項卡面板內放置了一個單獨的更新面板。
  • “Invalid Viewstate”錯誤的主要原因是當 ViewState 變得“大”並且使用者在前一個請求完成之前點擊按鈕時引發異常……在我們的例子中,這很容易發生,因為回發正在使用ajax,因此在將 ViewState 發送到伺服器時瀏覽器不會停止響應。點擊此控制項會一遍又一遍地導致異常。這個概念在本文中得到了解釋, 但在該連結中沒有得到適當的可行解決方案!

我們已經用 50 個並髮使用者測試了該網站,沒有出現任何錯誤!希望這對所有面臨此錯誤的人有所幫助!

引用自:https://stackoverflow.com/questions/25256408