2009-02-23 118 views
54
時不時地(每天一次或左右)

我們看到以下類型在我們的記錄錯誤的一個ASP.NET 3.5應用程序我應該忽略偶爾的無效viewstate錯誤嗎?

  • 無效的視圖狀態
  • 無效的回發或回調參數

這些東西在ASP.NET應用程序中不時發生?有人建議我們花費大量時間來嘗試診斷導致問題的原因嗎?

回答

46

嗯,這取決於。無效的視圖狀態可能由於各種原因而發生。

  1. Viewstate太大,並且在用戶在頁面上導致回發之前未完成呈現。該修復通常是禁用觸發回發的所有控​​件,並在頁面加載完成後啓用客戶端 - 請參閱http://blogs.msdn.com/tom/archive/2008/03/14/validation-of-viewstate-mac-failed-error.aspx
  2. 您正在使用viewstate MAC(出於安全原因,您應該是),但您尚未設置機器鍵和應用程序池已經回收並生成一個新的。不要忘記設置一個ViewStateUserKey。
  3. 有人在Mac上使用舊版本的IE來截斷隱藏的表單字段。在這種情況下,您需要將viewstate移出頁面session state
  4. Viewstate MAC問題通常表明您在Web場中,並且忘記在web.config中設置機器密鑰。但是如果你這樣做了,那麼它可能是有人試圖做壞事(機器人張貼評論,有人試圖觸發禁用控件的事件等)。只有排除潛在的安全問題,才能追蹤這些原因。

不管你做什麼關閉視圖狀態或事件驗證。

+1

你能提供有關項目2更詳細? – 2009-08-27 04:56:43

+5

以及viewstate包含一個簽名,以防止某人在客戶端編輯它。該簽名是從服務器的機器密鑰生成的。除非您特別設置計算機密鑰,否則應用程序池重新啓動時會重新生成計算機密鑰,導致以前的所有視圖狀態變爲無效。如果你有用戶認證,你也應該設置一個ViewStateUserKey來防止CSRF。 – blowdart 2009-08-27 06:06:01

1

對於前者我們可以做的事情不多 - 我會捕獲這些異常,並將用戶跳轉到錯誤頁面,並沿着「您所在的頁面已過期的消息」,這通常發生在您嘗試重新訪問一個你已經輸入數據的頁面。「

我在使用UpdatePanels的相當大的頁面上看到後者最多。我認爲這是用戶在頁面加載完成之前發回(或可能回調)的時間,因此並非所有在頁面末尾標記的javascript都已運行。

同樣,除了在您的錯誤頁面上顯示適當友好的消息外,您無法對其進行任何操作。

7

一個問題可能是用戶路由器截斷表單域。解決這個問題的方法是在web.config中將MaxPageStateFieldLength設置爲一個小數(如100),並將ViewState分解爲小塊。這很簡單,this article完全解釋它。

+0

這個改變是否幫助我避免「Base64」錯誤? – 2017-07-01 11:11:12

3

例外情況不會隨時發生。他們總是出於正當理由,其中一些已經在其他答案中列出。

但是,爲了緩解ViewState的問題,請考慮徹底禁用它。作爲ASP.NET開發人員,我們經常傾向於在各種不需要的地方使用ViewState,因爲它是默認的。在考慮使用控件之前,我通常會考慮使用靜態html。如果您決定使用控件,請考慮是否確實需要啓用ViewState。禁用它通常會導致更好的頁面加載時間,所以如果可以的話,請執行此操作。

我希望它被默認禁用,所以人們被迫這樣想,但事實並非如此。

更新回答評論:

我的頭,我拿出3分的機會來關閉ViewState中的頂部。

  1. 如果數據在每次回發中加載,則禁用ViewState。如果你正在構建支持AJAX的站點(這是real AJAX不是UpdatePanel類型;)),這通常會是這種情況,您通常在第一次加載時加載數據,然後使用AJAX請求重新加載/更新數據。在某些情況下,您甚至可能在每次訪問時加載數據,僅用於禁用ViewState,然後將數據緩存在服務器上。

  2. 你也可以考慮禁用ViewState,如果你綁定到真正靜態的內容。有時我會發現一個數據綁定到數據庫中的一個小靜態基礎表的列表或類似的東西。現在,這可能是危險的,但是如果我確信數據不會改變,我可能會將數據作爲靜態內容移動到頁面中(可以將其包裝在單獨的控件中,以便不會有數據的多個靜態副本)。但是如果數據改變了,你將不得不手動改變它。

  3. 簡單的控件(如標籤)通常是禁用ViewState的好選擇。

最後,你可以切換到ASP.NET MVC框架,並揮手告別這些問題永遠,這就是我打算做的,即使我會面臨一些問題。 ;)

0

忽略此錯誤可能不是一個好主意。除了上述所有答案之外,您還可以考慮查看視圖狀態的大小。代理服務器可以截斷大視圖狀態。

如果您的視圖狀態很大,那麼使用ASP.net跟蹤來查看哪些控件正在使用viewstate以及可以關閉它的位置可能是一個好主意。

0

據韋恩沃爾特·貝瑞在this博客張貼另一個罪魁禍首可以使用IE8的XHTML文檔類型而對具有符合XHTML標記頁。這可能會導致IE8將scrambled參數發送到scriptresource.axd並拋出無效的viewstate異常。

他建議確保所有的javascript塊都包含// <![CDATA[]]>或者只是更改doctype(這可能會導致頁面上的其他CSS /樣式問題)。

0

我有過這樣的異常被拋出在我的日誌,不得不從這裏列出的其他一個非常不同的原因。我確實有一個非常大的ViewState,這是問題的一部分。但是,這與另一個問題相結合導致了這些異常(並且可能偶爾會從IIS中收到不良響應)。

我正在處理的代碼庫中有一些奇特的代碼,以避免雙擊,並作爲其中的一部分,它添加了一些東西到每個按鈕的單擊事件的JavaScript,第一次點擊後禁用按鈕,然後通常的回傳。但是像這樣調用回發是一個問題,因爲我的一些按鈕已經有一個由.NET自動生成的回發調用。所以我最後得到了兩個回傳,其中一個有一個無效的ViewState。刪除額外的回發爲我停止了例外。

我知道我應該真的大大減少ViewState的大小,但這是一個很大的遺留代碼庫,並且這樣的改變會非常有創意。

0

無效的視圖狀態對您的記錄器或用戶或您的網站沒有任何價值,最終用戶從不會看到這些錯誤。 避免這種錯誤,請嘗試添加以下在Global.ascx

void Application_Error(object sender, EventArgs e) 
    {   
       if (ex is HttpException && ex.InnerException is ViewStateException) 
       { 
        Response.Redirect(Request.Url.AbsoluteUri); 
        return; 
       } 
    } 

更多的信息查看以下鏈接:

https://www.karpach.com/viewstateexception-invalid-viewstate.htm

相關問題