Cur*_*urt 9 asp.net viewstate iis-7 asp.net-2.0 asp.net-3.5
如果您在我们服务器上托管的某个网站上打开网页,请将其保留20分钟,然后提交表单,Validation of viewstate MAC failed.则会发生错误.
有什么可能的原因呢?
Kev*_*Kev 13
这可能会发生以下几个原因:
自动生成的机器密钥:
如果您的应用程序池有20分钟默认的超时时间和你正在使用自动生成的验证和解密密钥,然后在每次池启动它会生成一组新的密钥.这会使浏览器的加密视图状态无效.您还会发现持久性票证的表单身份验证票证也将变为无效.
要克服此问题,请将这些键设置为固定值:
`c:\%systemroot%\microsoft.net\framework\v2.0.50727\CONFIG\machine.config`
Run Code Online (Sandbox Code Playgroud)
您需要将<machineKey>配置元素添加到该<system.web>部分.这里有一篇非常好的文章解释了如何做到这一点:
向下滚动到" Web场部署注意事项 "部分并生成加密随机密钥.
如果您正在运行负载平衡的Web场,则还需要将每个服务器的计算机密钥设置为完全相同的值.
表单action值不正确(3.5SP1):
还有一个案例(3.5SP1之后),如果你将actionASP.NET表单的属性设置为回发的页面之外的其他内容而你没有使用跨页面回发,那么你将收到此错误.但你马上就会看到这个:
时间/长时间运行页面:
如果页面部分呈现并发生回发,那么页面的边缘情况需要很长时间才能呈现:
根本原因出现此异常是因为使用DataKeyNames的控件需要加密Viewstate.当Viewstate被加密时(默认模式,自动,如果控件需要加密,否则不加密),页面在关闭标签之前添加字段.但是这个隐藏字段可能没有被渲染到具有长时间运行页面的浏览器,并且如果你在它之前进行回发,浏览器会启动回发而不使用此字段(在表单集合中).最终结果是,如果在回发时省略此字段,则页面不知道Viewstate已加密并导致上述异常.在进行回发之前,IE页面需要完全加载.
Cur*_*urt 12
我们花了一段时间才找到答案,因为我被告知我正在比较它的另一台IIS7服务器是由同一个人以同样的方式设置的.
事实证明,使用Plesk设置了收到此错误的网站的服务器,而其他服务器没有设置.
似乎Plesk在应用程序池上将Idle-Timeout设置为5分钟,这就是导致此错误的原因.
要更改此,请执行以下操作:
| 归档时间: |
|
| 查看次数: |
15464 次 |
| 最近记录: |