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. linux同步windows的时间

    找了很多的资料,都没有windows做时间服务,linux同步windows的时间的,最后自己找了一些软件,终于搞定了,写出来给大家共享,以免大家多走弯路 首先在http://www.meinberg ...

  2. foreach 跟volist 有什么区别?

    <foreach name="list" item="vo">{$vo.id}{$vo.name}</foreach>Foreach标签 ...

  3. 样式的操作-不同浏览器加载不同的css文件

    ———————————————————— <script type="text/javascript">            //body加载事件监听函数       ...

  4. CSS3秘笈:第七章

    第七章  margin.padding和border 1.盒模型:四个属性: (1)padding:内容与其边框线之间的空间. (2)border:盒子周围的直线 (3)background-colo ...

  5. LeetCode OJ 223.Rectangle Area

    Find the total area covered by two rectilinear rectangles in a 2D plane. Each rectangle is defined b ...

  6. centos 6.2安装bind 9.8.2 master、slave与自动修改后更新

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://dl528888.blog.51cto.com/2382721/1249311 随 ...

  7. linux视频学习3(shell和网络)

    1.shell的学习. shell的种类比较多,主要有三种: /bin/sh, /bin/csh, /bin/ksh. 查看当前使用的是哪种shell : 命令env (显示当前操作系统的环境变量). ...

  8. curl file_get_contents fsockopen

    三种处理的方式:     curl     file_get_contents     fsockopen fsockopen 是比较底层的调用,属于网络系统的socket调用,而curl经过的包装支 ...

  9. ubuntu环境下安装Tomcat

    tomcat 是javaweb开发的本地服务器,tomcat是目前比较流行的一款. 1.下载Tomcat:http://tomcat.apache.org 2.进入下载文件夹解压Tomcat:sudo ...

  10. CSS的命名

    使用约定俗称的命名规范有助于我们的代码阅读和维护. 常用命名: wrap  外套       ———————— 用于最外层 container 容器  ————————  和外套相似,用于做容器 he ...