异常"Validation of ViewState Mac failed"及解决办法


 项目顺利完成,到客户现场进行系统测试(使用VS2005进行压力测试和响应测试),在系统日志中出现如下错误:

[HttpException (0x80004005): Validation of viewstate MAC failed. If this application is hosted by a Web Farm or cluster, ensure that <machineKey> configuration specifies the same validationKey and validation algorithm. AutoGenerate cannot be used in a cluster.]

  应用程序部署在NLB环境,访问MSCS集群的SQL Server 2005数据库,包括应用程序服务器、数据库服务器、文件服务器等都可以做Failover。

  在公司进行测试的时候,2.5倍于客户现场测试的压力下没有此问题,所以主要怀疑受性能影响。

  <1>服务器端检查:客户服务器优于开发测试用服务器为双核酷睿(8 CPU),内存4GB,通过监视程序没有出现IIS进程超过2GB情况(基本在700MB左右)。

  <2>客户端检查:因为是金融公司所以客户端性能比测试用客户端性能差很多,使用VS2005进行测试的时候,每台机器只能分配500个用户,CPU使用率达90%-100%。

  怀疑由于客户端能力比较差,页面未能完全表示进行回发出现问题。通过查找资料,获得如下信息:

  * 确保你没有使用Web Form

  * 你使用了内置数据绑定控件(如GridView),并且由于绑定的数据中有主键或索引所以设置了DataKeyNames属性。

  * 你的页面表示的内容数据量大或加载时间比较长。

  满足以上条件时,如果页面没有完全加载到客户端(IE)进行回发(Posting Back),你可能会看到上面的异常信息。

  此问题出现的原因是GridView等数据绑定控件使用DataKeyNames属性时,请求ViewState加密。此方法会在页面</form>标签的上方追加<input type="hidden" name="__VIEWSTATEENCRYPTED" id="__VIEWSTATEENCRYPTED" value="" />标签。当请求的页面信息量比较大,相应时间比较长的时候,客户端可能还没有完全表示就可以通过页面的按钮触发服务器端回发(服务器端控件操作)。因为回发的内容不包括加密标签,回到服务器端进行验证的时候就会失败。(此问题不仅在测试软件的情况下会出现,经测试,在客户使用系统的时候此问题也可能出现。)

  解决此问题的方法是在web.config中关闭事件验证和ViewState加密属性的开关,如下:

<pages enableEventValidation="false" viewStateEncryptionMode ="Never" />

  但请注意关闭开关引起的安全问题,稍后会发文讨论Event Validation和ViewState Validation等安全性设定内容的实质,讨论使用场景


« 
» 
快速导航

Copyright © 2016 phpStudy | 豫ICP备2021030365号-3