2

在我们的日志文件中,我发现以下异常。(ASP.NET,Sitecore 6.6)。任何想法为什么会发生这种情况?

我提到了这篇文章。我的应用程序不在服务器场中。此外,并非每次回发都会发生这种情况。

7776 02:11:53 ERROR Application error. 
Exception: System.Web.HttpException 
Message: 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. 
Source: System.Web 
at System.Web.UI.ViewStateException.ThrowError(Exception inner, String persistedState, String errorPageMessage, Boolean macValidationError) 
at System.Web.UI.ObjectStateFormatter.Deserialize(String inputString, Purpose purpose) 
at System.Web.UI.Util.DeserializeWithAssert(IStateFormatter2 formatter, String serializedState, Purpose purpose) 
at System.Web.UI.HiddenFieldPageStatePersister.Load() 
at System.Web.UI.Page.LoadPageStateFromPersistenceMedium() 
at System.Web.UI.Page.LoadAllState() 
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) 
at System.Web.UI.Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) 
at System.Web.UI.Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) 
at System.Web.UI.Page.ProcessRequest() 
at System.Web.UI.Page.ProcessRequest(HttpContext context) 
at System.Web.UI.Page.ProcessRequest(HttpContext context) 
at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 
at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) 

Nested Exception 

Exception: System.Web.UI.ViewStateException 
Message: Invalid viewstate. 
Client IP: xxx.xxx.xxx.201 
Port: <PORT> 
Referer: <URL> 
Path: /<PAGE>
User-Agent: Mozilla/5.0 (Windows NT 6.2) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11 
ViewState: /wEPDwUJMzY0OTY5Mjg5D2QWAgIFEGRkFgQCAw9kFgJmD2QWAmYPZBYCAg4PZBYCZg9kFgQCAw8PFgQeFUN1cnJlbnRTZWxlY3Rpb25WYWx1ZQUkMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwHhRDdXJyZW50U2VsZWN0aW9uVGV4dAUVQWxsIENhdGVnb3JpZXMgKDY5NTEpZBYCAgEPZBYCZg9kFgICAQ8UKwACDxYGHgRUZXh0BRVBbGwgQ2F0ZWdvcmllcyAoNjk1MSkeBF8hU0ICAh4IQ3NzQ2xhc3MFB1Rvb2xCYXJkEBYBZhYBFCsAAmRkDxYBZhYBBXdUZWxlcmlrLldlYi5VSS5SYWRDb21ib0JveEl0ZW0sIFRlbGVyaWsuV2ViLlVJLCBWZXJzaW9uPTIwMTIuMi42MDcuMzUsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MTIxZmFlNzgxNjViYTNkNBYCAgIPFCsAAWQWAgIBDxQrAAIUKwACFCsAAg8WBB8EBQdUb29sQmFyHwMCAmQPFCsAARQrAAIPFgYfAgUVQWxsIENhdGVnb3JpZXMgKDY5NTEpHgVWYWx1ZQUkMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwHghTZWxlY3RlZGdkZA8UKwEBZhYBBXNUZWxlcmlrLldlYi5VSS5S...
4

2 回答 2

4

请检查此链接

根本原因 出现此异常是因为使用 DataKeyNames 的控件要求对 Viewstate 进行加密。当 Viewstate 被加密时(默认模式,Auto,如果控件需要加密,否则不需要加密),Page 在标签关闭之前添加字段。但是这个隐藏字段可能没有被呈现给浏览器长时间运行的页面,如果你在它之前进行回发,浏览器会在没有这个字段的情况下启动回发(在表单发布集合中)。最终结果是,如果在回发时省略该字段,则页面不知道 Viewstate 已加密并导致上述异常。IE 页面预计在您进行回发之前已完全加载。

顺便说一下,事件验证也有类似的问题,因为 __EVENTVALIDATION 字段也呈现在表单的末尾。这是一项安全功能,可确保回发操作仅来自服务器允许和创建的事件,以帮助防止欺骗性回发。此功能是通过让控件在渲染时注册有效事件来实现的(如在其实际的 Render() 方法中)。最终结果是在渲染标签的底部,您会看到如下内容: 。当回发发生时,ASP.NET 使用存储在此隐藏字段中的值来确保您单击的按钮调用有效事件。如果它无效,则会出现上述异常。

当您在呈现 EventValidation 字段之前回发时,就会出现此问题。如果启用了 EventValidation(默认情况下启用),但 ASP.net 在您回发时看不到隐藏字段,您也会遇到异常。如果您在表单完全呈现之前提交表单,则可能 EventValidation 字段尚未呈现,因此 ASP.NET 无法验证您的点击。

解决方法 1. 将 enableEventValidation 设置为 false 并将 viewStateEncryptionMode 设置为 Never,如下所示:

这具有禁用验证和加密的不良副作用。在某些网站上,这样做可能没问题,但这不是最佳做法,尤其是在面向公众的网站中。

于 2013-10-14T07:34:46.587 回答
0

我最近的项目中有类似的问题。当我试图从谷歌寻求帮助时,大多数人讨论的事情如下

在 web.config 中添加机器密钥

<system.web> <machineKey validationKey="..." decryptionKey="..." validation="SHA1" /> </system.web>

在 web.config 中设置 EnableViewStateMAC=False

<system.web> <pages enableViewStateMac="False"/> </system.web>

但是以上所有解决方案都对我不起作用。每当我尝试使用 IP 地址打开应用程序时,它都可以正常工作,但是如果我尝试使用域名打开应用程序,它会显示“Viewstate MAC failed”错误。我深入研究找出问题所在,最后我找到了解决方案,当浏览器不接受来自服务器的 cookie 时会发生此错误。

Godaddy 提供了带有掩码的域转发功能。我的一位同事在我们的应用程序域中设置了该功能,IE 和 Safari 具有不接受来自第三方和广告商的 cookie 的安全级别,因此这两个浏览器都生成了“Viewstate MAC failed”错误。

您可以在 IE 工具 > Internet 选项 > 隐私和移动设置滑块底部的值“接受所有 Cookie”中将安全级别设置为接受所有 cookie。

希望这个解决方案能帮助其他人摆脱 asp.net 遗留错误“Viewstate MAC failed”。

于 2016-04-08T11:07:44.703 回答