驗證視圖狀態 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="d41d8cd98f00b204e9800998ecf8427e0e5798a7e2c46b2fd4f0277bceaf08e1" validation="SHA1"/>
解決
最重要的是檢查自己的頁面,很可能是你的頁面中的問題,多注意下,肯定能發現問題,而這個問題並沒有報出你想要的錯誤 !!!
所以,不一定所有的解決方案都適合你!!!