ASP.NET:无法验证数据
在ASP.NET中导致此异常的原因是什么?显然,这是一个viewstate异常,但是我无法在引发异常的页面上重现该错误(一个简单的两个TextBox窗体,带有一个按钮和导航链接)。
FWIW,我没有运行网络农场。
例外
Error Message: Unable to validate data. Error Source: System.Web Error Target Site: Byte[] GetDecodedData(Byte[], Byte[], Int32, Int32, Int32 ByRef)
发布数据
VIEWSTATE: /wEPDwULLTE4NTUyODcyMTFkZF96FHxDUAHIY3NOAMRJYZ+CKsnB EVENTVALIDATION: /wEWBAK+8ZzHAgKOhZRcApDF79ECAoLch4YMeQ2ayv/Gi76znHotheitroadyBFrWtwyg=
异常堆栈跟踪
at System.Web.UI.ViewStateException.ThrowError(Exception inner, String persistedState, String errorPageMessage, Boolean macValidationError) at System.Web.UI.ObjectStateFormatter.Deserialize(String inputString) at System.Web.UI.ObjectStateFormatter.System.Web.UI.IStateFormatter.Deserialize(String serializedState) at System.Web.UI.Util.DeserializeWithAssert(IStateFormatter formatter, String serializedState) 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() at System.Web.UI.Page.ProcessRequestWithNoAssert(HttpContext context) at System.Web.UI.Page.ProcessRequest(HttpContext context) at ASP.default_aspx.ProcessRequest(HttpContext context) at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
〜威廉·赖利·兰德
解决方案
导致此错误的最可能原因是,在所有视图状态加载之前停止回发(用户单击"停止"或者"后退"按钮)时,视图状态将无法验证并引发错误。
其他潜在原因:
- 应用程序池在生成视图状态的时间与用户将视图状态发布回服务器的时间之间进行循环(不太可能)。
- 一个不同步machineKey的Web场(不是问题)。
更新:有关此问题的Microsoft文章。除上述内容外,它们还建议了其他两个潜在原因:
- 通过防火墙/防病毒软件修改视图状态
- 从一个aspx页面发布到另一页面。
我已经遇到了某些特定版本的Safari 3的问题。我的解决方案是将ViewState移到表单顶部(扩展了Page类,并覆盖了3.5 SP1之前版本或者.Net 3.5 SP1和更高版本的Render方法。会默认执行此操作),并将ViewState分为几个不同的字段,而不是一个怪物文件。请参阅ASP.NET 2.0中的ViewState Chunking(maxPageStateFieldLength)
"a postback is stopped before all the viewstate loads"
我以前遇到过这个确切的问题,这就是原因。
最初,我们禁用了ViewStateMac属性(在page指令中使用了enableViewStateMac =" false")来解决该问题,但这并不是解决问题的真正方法,并且可能威胁到数据完整性。我们最终通过禁用提交按钮直到页面完全加载来解决该问题,并通过在某些控件上禁用它来调整视图状态的大小。
在.NET 3.5 SP1中,RenderAllHiddenFieldsAtTopOfForm属性已添加到PagesSection配置中。
Web.config
<configuration> <system.web> <pages renderAllHiddenFieldsAtTopOfForm="true"></pages> </system.web> </configuration>
有趣的是,它的默认值为true。因此,从本质上讲,如果我们使用的是.NET 3.5 SP1,则ViewState会自动呈现在表单顶部(在加载页面的其余部分之前),从而消除了我们遇到的ViewState错误。
当我在页面上设置表单标签而没有动作属性时,出现此错误,然后在代码隐藏中,将表单的动作属性更改为" Action.aspx"。
在JavaScript中,我提交了表单(theForm.submit();)
我认为就我而言,这是一个安全问题,在页面上已经设置好之后,我们将无法更改它?
我已经在我的网站上找到了这个问题的根源,我终于设法解决了这个问题。这不是我们问题的直接答案,但我想分享这一小段信息。
过去,我尝试了所有方法(包括上述Jeffaxe提出的解决方案),但没有任何结果,并且我不想在页面上设置enableViewStateMac =" false"
(如Raelshark所述),因为这只是隐藏了问题。
是什么导致我的问题呢?该问题是由于在我网站的某些页面中使用了Intelligencia.UrlRewriter(2.0 RC 1内部版本6)模块引起的。我使用了一些SEO友好链接,这导致ViewState验证失败。当我使用"普通"链接(而不是SEO友好链接)时,问题消失了!
我重现了该问题几次,以确保它不是一个错误警报(我使用ASP.NET 3.5)。
我知道有些人可能未使用上述模块,但仍然收到此错误,这表明原因是其他原因。至少,分享这种经验可能对某些人有所帮助。