Validation of viewstate MAC failed异常的原因及解决方法

作者:袖梨 2022-06-25

Validation of viewstate MAC failed异常的原因及解决方法

事件日志里偶尔能发现这个错误,却一直找不到有效的解决方法。经过仔细研究分析之后,发现出现这个错误的概率还是很小的,还需要满足多个条件才行:
1.页面中使用了GridView, DetailsViews, FormView等采用内置数据绑定控件
2.就是这个页面的内容较多,在网速较慢的情况下需要较长的时间才能加载完
3.在页面还没有加载完成的情况下,点击了Postback性质的按钮。如果是get方式的url链接请求则不存在此问题

内在的深层次原因,是由于GridView等控件,为了避免暴露数据库教程中的字段名称,在默认的asp教程.net 2.0设置之下,会对GridView里用到的DataKeyNames使用加密方式存储在ViewState里,并在页尾标签标签之前写入一个隐藏域用来表明ViewState是使用加密存储的。
由于这个隐藏域在页尾,因此在前面所述为页面尚未完全加载的情况下就点击Post方式的按钮,就会导致在服务器端处理反序列化viewstate时,因为找不到这个隐藏域而认为是非法的ViewState,而抛出这个异常。

解决方法就是禁止ViewState的加密,不利之处是会降低网站的安全性。
如果要禁用整个站点或者模块的ViewState加密,只需在web.config里作如下设置即可:
lt;pages enableEventValidation="false" viewStateEncryptionMode ="Never" />
当然也可以只对有出现这个问题页面的<@page作enableEventValidation="false" viewStateEncryptionMode ="Never" 设置,这样的话只会在这个页面的ViewState不作加密,不会影响到整个站点所有页面的安全性。

 

相关文章

精彩推荐