如果您在我们服务器上托管的网站中打开一个网页,将其保留20分钟然后提交一个表单,将会出现“验证视图状态MAC失败”错误。
这可能是什么原因呢?
如果您在我们服务器上托管的网站中打开一个网页,将其保留20分钟然后提交一个表单,将会出现“验证视图状态MAC失败”错误。
这可能是什么原因呢?
这可能出现几种情况:
自动生成的机器密钥:
如果您的应用程序池具有默认的20分钟空闲超时时间,并且使用的是自动生成的验证和解密密钥,则每次池启动时都会生成一组新的密钥。这将使浏览器中的加密视图状态失效。您还会发现用于持久票证的表单身份验证票证也将变得无效。
要克服这个问题,请将这些密钥设置为固定值,放在以下位置:
`c:\%systemroot%\microsoft.net\framework\v2.0.50727\CONFIG\machine.config`
你需要在<system.web>
部分添加<machineKey>
配置元素。这里有一篇非常好的文章,解释了如何做到这一点:
请滚动到“Web农场部署注意事项”和生成加密随机键。
时间/长时间运行的页面: 还有一种边缘情况,对于需要很长时间才能呈现的页面,如果页面部分呈现并发生postback:
根本原因:这个异常出现是因为使用DataKeyNames的控件需要加密Viewstate。当Viewstate被加密时(默认模式是自动加密如果控件需要,否则不加密),页面在关闭tag之前添加一个隐藏字段。但是,在长时间运行的页面中可能没有呈现此隐藏字段,如果在它之前进行postback,则浏览器会在不带有此字段的情况下启动postback(在表单post收集中)。最终的结果是,如果在postback时省略了此字段,则页面不知道Viewstate已经加密,并导致上述异常。即页面期望在你进行postback之前完全加载。
我们花了一些时间才找到了答案,因为我被告知另一个我正在进行比较的IIS7服务器是由同一人以相同的方式设置的。
后来发现,接收此错误的网站所在的服务器使用的是Plesk,而另一个服务器没有使用。
看起来Plesk将应用程序池的空闲超时设置为5分钟,这正是导致此错误的原因。
要更改此设置,请执行以下操作:
对我来说,这解决了问题:
我已经在应用程序池中设置LoadUserProfile = True
,使得HKCU注册表子项对应用程序可用。
注意:此方法适用于IIS 7.0及以上版本。
视图状态 MAC 验证失败。如果此应用程序由 Web Farm 或集群托管,请确保配置指定相同的验证密钥和验证算法。不能在集群中使用 AutoGenerate。
我发现我的母版页标题部分有一个 <base ....
标记,我是在最后一次添加并发布之前添加的。这个标记指定页面上所有链接的默认 URL 和默认目标。这是这次故障的主要原因。