ASP.NET:无法验证数据

时间:2008-09-26 15:39:31

标签: asp.net validation exception viewstate

ASP.NET中此异常的原因是什么?显然它是一个viewstate异常,但是我无法在抛出异常的页面上重现错误(带有按钮和导航链接的简单的两个TextBox表单)。

FWIW,我没有经营网络农场。

异常

  

错误消息:无法验证   数据

     

错误来源:System.Web

     

错误目标站点:字节[]   GetDecodedData(Byte [],Byte [],Int32,   Int32,Int32 ByRef)

发布数据

  

VIEWSTATE:

     

/ wEPDwULLTE4NTUyODcyMTFkZF96FHxDUAHIY3NOAMRJYZ + CKsnB

     

EVENTVALIDATION:

     

/ wEWBAK + 8ZzHAgKOhZRcApDF79ECAoLch4YMeQ2ayv / Gi76znHooiRyBFrWtwyg =

异常堆栈跟踪

   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)

~William Riley-Land

8 个答案:

答案 0 :(得分:18)

此错误的最可能原因是在所有视图状态加载(用户点击停止或返回按钮)之前停止回发时,视图状态将无法验证并抛出错误。

其他可能的原因:

  • 应用程序池在生成视图状态和用户将其发回服务器的时间之间进行回收(不太可能)。
  • 未同步machineKeys的Web场(不是您的问题)。

更新:Microsoft article on the issue。除上述内容外,他们还提出了另外两个可能的原因:

  • 防火墙/防病毒软件修改viewstate
  • 从一个aspx页面发布到另一个页面。

答案 1 :(得分:9)

在.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错误。

答案 2 :(得分:6)

我遇到过某些特定版本的Safari 3的问题。我的解决方案是将ViewState移动到表单的顶部(扩展Page类并覆盖3.5之前的Render方法,或.Net 3.5 SP1和更高版本默认执行此操作),并将ViewState拆分为几个不同的字段而不是一个怪物文件。 请参阅ViewState Chunking in ASP.NET 2.0 (maxPageStateFieldLength)

答案 3 :(得分:4)

这个免费的在线工具:http://aspnetresources.com/tools/machineKey在web.config文件中的system.web元素下生成一个machineKey元素。 以下是它生成的示例:

<machineKey validationKey="1619AB2FDEE6B943AD5D31DD68B7EBDAB32682A5891481D9403A6A55C4F91A340131CB4F4AD26A686DF5911A6C05CAC89307663656B62BE304EA66605156E9B5" decryptionKey="C9D165260E6A697B2993D45E05BD64386445DE01031B790A60F229F6A2656ECF" validation="SHA1" decryption="AES" />

在web.config中看到这个后,错误本身突然变得有意义。 你得到的错误是

  

“确保配置指定相同   validationKey和验证算法“。

当你看这个machineKey元素时,突然你可以看到它在说什么。


通过在web.config中“硬编码”此值,asp.net用于序列化和反序列化视图状态的密钥保持不变,无论服务器场中的哪个服务器接收它。您的加密变得“可移植”,因此您的视图状态变为“可移植”。

我只是猜测也许非常相同的服务器(不在服务器场中)有这个问题,如果由于任何原因它“忘记”它所拥有的密钥,由于任何重置消除它的水平。这也许就是为什么你在闲置期后看到这个错误并尝试使用“陈旧”页面的原因。

答案 4 :(得分:3)

  

“在所有视图状态加载之前停止回发”

我以前遇到过这个问题,这就是原因。

最初我们禁用ViewStateMac属性(enableViewStateMac="false"指令中的page)来解决它,但这不是问题的真正解决方案,可能会威胁数据完整性。我们最终通过禁用我们的提交按钮来解决它,直到页面完全加载,并通过在某些控件上禁用它来修剪视图状态的大小。

答案 5 :(得分:3)

我在网站上找到了这个问题的根源,我终于设法解决了。这不是你问题的直接答案,但我想分享这一小部分信息。

过去我尝试过所有内容(包括上面提到的Jeffaxe解决方案)但没有结果,我不想将enableViewStateMac="false"(如上面提到的Raelshark)设置到我的页面,因为这只是隐藏了这个问题。

在我的案例中导致问题的原因是什么?问题是由于在我的网站的某些页面中使用 Intelligencia.UrlRewriter (版本2.0 RC 1版本6)模块引起的。我使用了一些SEO友好链接,这导致ViewState验证失败。当我使用“普通”链接(而不是SEO友好链接)时,问题就消失了!

我重复了几次这个问题,以确保它不是误报(我使用的是ASP.NET 3.5)。

我知道有些人可能不会使用上面的模块,但仍然会收到此错误,这意味着原因是其他原因。至少,分享这种经验可能对某些人有所帮助。

答案 6 :(得分:2)

当我在没有action属性的页面上设置了表单标记时出现此错误,然后在代码隐藏中,我将表单的action属性更改为“Action.aspx”。

在JavaScript中,我提交了表单(theForm.submit();)

我认为在我的情况下这是一个安全问题,并且在页面上已经设置后你无法改变它??

答案 7 :(得分:1)

不确定这是否会对任何人有所帮助,但我的解决方案是在我的webconfig中排除machineKey以使我的cookie通过。