ViewState是一种机制,ASP.NET 使用这种机制来跟踪服务器控件状态值,否则这些值将不作为 HTTP 窗体的一部分而回传。
也就是说在页面刷新或者回传的时候控件的值将被清空,我们在aspx.cs中也经常用ViewState来存储值,作为一种存储状态,取代会话状态(session).
我经常在aspx.cs中试用Viewstate来存储数据状态,比如

Viewstate[“name”]=”殷海超”;,然后程序会把这个Viewstate保存为键-值对形式,这是会有一个序列化和反序列化的过程(序列化就是将对象的状态
信息转换为可以存储或传输形式的过程。其实就是将对象持久化,比如说把对象保存为二进制或者是XML的方式。可以将对象序列到流、磁盘、内存和网络等等。相反,反序列化则是将存储或传输形式转换为对象的过程。),Viewstate[“name”]=”殷海超”这是序列化,因为其实这里是序列化为字符串放置至HTML页面中(中间过程何其复杂。还未理解);string name= Viewstate[“name”];这是反序列化

“id”属性为“__EVENTVALIDATION”的隐藏字段是ASP.NET 2.0的新增的安全措施。该功能可以阻止由潜在的恶意用户从浏览器端发送的未经授权的请求.

对于内容较多,功能较为复杂的页面,如本站的课程详细信息页面,偶尔会出现Validation of viewstate MAC failed的错误。 
在异常的信息里,会说是在web farm或者集群环境下,machineKey的配置不一致导致的。而事实上,我们还并没有使用web场和集群,因此异常的提示信息显然是一种误导了。

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

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

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

微软已经确认这是一个Bug,详细地讨论也可以参考asp.net官方站点http://forums.asp.net/1/1173230/ShowThread.aspx

转:Validation of viewstate MAC failed异常的原因及解决方法的更多相关文章

  1. 一个有趣的 ”Validation of viewstate MAC failed” 错误的发现和解决

    在ASP.NET里面,View State使用较为广泛.它作为一个隐藏字段,可以帮助服务端”记住“客户端的改变,这样客户端 收到服务器对PostBack的响应后,仍然可以展现在PostBack之前设定 ...

  2. Validation of viewstate MAC failed. 解决方法

    前段时间公司为了减轻服务器压力,对网页做了集群,分布在多台服务器,通过DNS轮回解析到各台服务器,结果页面只要打开停留到DNS解析到下一个地址,就会出现出下错误信息. Validation of vi ...

  3. ”Validation of viewstate MAC failed” 错误

    ”Validation of viewstate MAC failed” 错误 在ASP.NET里面,View State使用较为广泛.它作为一个隐藏字段,可以帮助服务端”记住“客户端的改变,这样客户 ...

  4. Validation of viewstate MAC failed machinekey生成、使用方法

    前段时间公司为了减轻服务器压力,对网页做了集群,分布在多台服务器,通过DNS轮回解析到各台服务器,结果页面只要打开停留到DNS解析到下一个地址,就会出现出下错误信息. Validation of vi ...

  5. Validation of viewstate MAC failed 解决办法

    大部分人都说是在页里或web.config里加EnableEventValidation="false" EnableViewStateMac="false" ...

  6. jsp出现getOutputStream() has already been called for this response异常的原因和解决方法

    jsp出现getOutputStream() has already been called for this response异常的原因和解决方法 在tomcat5下jsp中出现此错误一般都是在js ...

  7. 出现 java.net.ConnectException: Connection refused 异常的原因及解决方法

    1 异常描述 在启动 Tomcat 服务器的时候,控制台一直输出异常信息,然后停止服务器,报出如下异常: 2 异常原因 通过观察上图中被标记出来的异常信息,咱们可以知道 java.net.Connec ...

  8. Struts2中使用execAndWait后,在 Action中调用getXXX()方法报告java.lang.NullPointerException异常的原因和解决方法

    使用 Struts2 编写页面,遇到一个要长时间运行的接口,因此增加了一个execAndWait ,结果在 Action 中调用 getContext()的时候报告异常 ActionContext c ...

  9. c#.net的网站出现“正在中止线程””异常的原因和解决方法

    出现“正在中止线程”异常通常都是由于以下三种原因导致引起,给出解决方案如下: 解决方案: 1.针对Response.End,调用 HttpContext.Current.ApplicationInst ...

随机推荐

  1. QTP脚本程序(原创自编)

    '编写哨位台程序测试脚本,实现功能如下:'1.自动添加100条查哨换岗人员记录,'2.自动添加美电.海康,大华视频.'3.自动配置视频设备.'4.检查后台进程是否存在.'5.视频轮巡.'####### ...

  2. how to download image from any web page in java 下载图片

    http://stackoverflow.com/questions/5882005/how-to-download-image-from-any-web-page-in-java (throws I ...

  3. LeetCode OJ 236. Lowest Common Ancestor of a Binary Tree

    Given a binary tree, find the lowest common ancestor (LCA) of two given nodes in the tree. According ...

  4. hdu 1212 Big Number(大数取模)

    Problem Description As we know, Big Number is always troublesome. But it's really important in our A ...

  5. sublime 2

    just baidu sublime license and find a free one!

  6. POJ 3597 种类数 数学+递推

    http://poj.org/problem?id=3597 题目大意:把一个正多边形分成数个三角形或者四边形,问有多少种方案. 思路:http://www.cnblogs.com/Ritchie/p ...

  7. Java中的一些术语的解释

    一  API(Application Programming Interface,应用程序编程接口) 简单来说,就是其他人开发出来一块程序,你想用,他会告诉你调用哪个函数,给这个函数传什么参数,然后又 ...

  8. JPA 系列教程4-单向一对多

    JPA中的@OneToMany @Target({METHOD, FIELD}) @Retention(RUNTIME) public @interface OneToMany { Class tar ...

  9. oracle-查询执行速度慢的sql

    Oracle 查询每天执行慢的SQL 2014-12-11 18:00:04 分类: Oracle 链接:http://blog.itpub.net/28602568/viewspace-136484 ...

  10. 求N以内与N互质的数的和

    题目连接 /* 求所有小于N且与N不互质的数的和. 若:gcd(n,m)=1,那么gcd(n,n-m)=1; sum(n)=phi(n)*n/2; //sum(n)为小于n的所有与n互质的数的和 // ...