10

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

FWIW,我没有运行网络农场。

例外

错误消息:无法验证数据。

错误来源:System.Web

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

发布数据

观点:

/wEPDwULLTE4NTUyODcyMTFkZF96FHxDUAHIY3NOAMRJYZ+CKsnB

事件验证:

/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)

~ 威廉·莱利-兰德

4

8 回答 8

18

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

其他潜在原因:

  • 从生成视图状态到用户将其发布回服务器(不太可能)之间的应用程序池回收。
  • machineKeys 未同步的网络场(不是您的问题)。

更新:关于该问题的 Microsoft 文章。除了上述之外,他们还提出了另外两个潜在的原因:

  • 通过防火墙/防病毒软件修改视图状态
  • 从一个 aspx 页面发布到另一个页面。
于 2008-09-26T16:21:46.500 回答
9

在 .NET 3.5 SP1 中,RenderAllHiddenFieldsAtTopOfForm属性被添加到 PagesSection 配置中。

网页配置

<configuration>

    <system.web>

        <pages renderAllHiddenFieldsAtTopOfForm="true"></pages>

    </system.web>

</configuration>

有趣的是,它的默认值为 true。因此,从本质上讲,如果您使用的是 .NET 3.5 SP1,那么 ViewState 会自动呈现在表单顶部(在加载页面的其余部分之前),从而消除您遇到的 ViewState 错误。

于 2008-10-31T19:08:29.953 回答
6

我遇到了某些特定版本的 Safari 3 的问题。我的解决方案是将 ViewState 移动到表单的顶部(扩展了 Page 类并覆盖了 pre-3.5 SP1 或 .Net 3.5 SP1 及更高版本的 Render 方法默认情况下这样做),并将 ViewState 拆分为几个不同的字段而不是一个怪物文件。请参阅ASP.NET 2.0 中的 ViewState 分块 (maxPageStateFieldLength)

于 2008-09-26T17:00:59.870 回答
4

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

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

一旦您在 web.config 中看到这一点,错误本身就会突然变得有意义。你得到的错误说

“确保配置指定相同的验证密钥和验证算法”。

当你看到这个 machineKey 元素时,你会突然明白它在说什么。


通过在 web.config 中“硬编码”这个值,asp.net 用于序列化和反序列化视图状态的键保持不变,无论服务器场中的哪个服务器选择它。您的加密变得“便携”,因此您的视图状态变得“便携”。

我也只是猜测,如果由于任何原因它“忘记”了它所拥有的密钥,可能是同一台服务器(不在场中)有这个问题,因为任何级别的重置都会将其清除。这也许就是您在空闲期后看到此错误并尝试使用“陈旧”页面的原因。

于 2011-08-23T03:31:49.597 回答
3

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

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

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

于 2008-09-26T19:27:36.977 回答
3

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

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

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

我多次重现该问题以确保它不是误报(我使用 ASP.NET 3.5)。

我知道你们中的一些人可能没有使用上面的模块,仍然得到这个错误,这意味着原因是别的。至少,分享这种经验可能对某些人有所帮助。

于 2010-06-03T04:21:36.377 回答
2

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

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

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

于 2009-04-02T21:07:54.483 回答
1

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

于 2011-01-11T13:52:10.660 回答