驗證視圖狀態 MAC 失敗。如果此應用程序由網絡場或羣集承載,請確保 <ma...

 
驗證視圖狀態 MAC 失敗。如果此應用程序由網絡場或羣集承載,請確保 <machineKey> 配置指定了相同的 validationKey 和驗證算法。不能在羣集中使用 AutoGenerate。
說明: 執行當前 Web 請求期間,出現未處理的異常。請檢查堆棧跟蹤信息,以瞭解有關該錯誤以及代碼中導致錯誤的出處的詳細信息。

異常詳細信息: System.Web.HttpException: 驗證視圖狀態 MAC 失敗。如果此應用程序由網絡場或羣集承載,請確保 <machineKey> 配置指定了相同的 validationKey 和驗證算法。不能在羣集中使用 AutoGenerate。

分析:

分析後找到了問題的根源。首先,文章中提到,如果用GridView,並且指定了DataKeyNames屬性,則出於安全的理由(因爲DataKeyNames指定的字段代表數據的主鍵,且該主鍵值需要保存在視圖狀態中發送到客戶端,用戶如果篡改主鍵值,會導致安全問題),GridView會要求加密視圖狀態。爲此會自動在頁面表單</forms>之前添加一個<input type="hidden" name="__VIEWSTATEENCRYPTED" id="__VIEWSTATEENCRYPTED" value="" /> 。

然而,Atlas的UpdatePanel要求放置在<form></form>內部,也就是</form>之前。這就意味着添加的隱藏input控件沒有被放置在UpdatePanel內,而是放置在UpdatePanel和</form>之間。

當UpdatePanel更新時,UpdatePanel內部的控件被提交到服務器進行處理(Patrial Rendering),而整個頁面並沒有被提交。也就是說隱藏的input控件沒有隨着一起提交。因此服務器並不知道提交的ViewState被加密了,從而導致MAC驗證錯誤。

解決方法有二,僅供參考:

1.可以在當前頁面的<page ...>里加兩個屬性:
enableEventValidation="false" viewStateEncryptionMode ="Never"

2.當然還可以在web.config里加入:(<system.web>之間)
<pages enableEventValidation="false" viewStateEncryptionMode ="Never" />

其餘方法   

在web.config中的pages節點上添加enableviewstatemac=false

附帶:::::

          一般而言是因爲你的某些操作修改了視圖狀態,我猜測你可能使用了ajax並在客戶端用javascript動態添加了某些項

1. 在出錯頁面的 <%@ page %>中加enableviewstatemac="false"無效。
2. 在web.config的 <system.web>節中加
<machineKey validationKey="3FF1E929BC0534950B0920A7B59FA698BD02DFE8" decryptionKey="280450BB36319B474C996B506A95AEDF9B51211B1D2B7A77" decryption="3DES" validation="SHA1"/>

我的問題是加入:<machineKey validationKey="3FF1E929BC0534950B0920A7B59FA698BD02DFE8" decryptionKey="280450BB36319B474C996B506A95AEDF9B51211B1D2B7A77"/>   解決

最重要的是檢查自己的頁面   很可能是你的頁面中的問題   多注意下 肯定能發現問題 而這個問題並沒有報出你想要的錯誤 !!!       所以 不一定所有的解決方案都適合你!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章