代码之家  ›  专栏  ›  技术社区  ›  wprl

ASP。NET:无法验证数据

  •  10
  • wprl  · 技术社区  · 17 年前

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

    FWW,我不是在经营一个网络农场。

    例外

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

    错误来源:系统。网络

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

    传递数据

    视图状态:

    /wEPDwULLTE4NTUyODcyMTFkZF96FHxDUAHIY3NOAMRJYZ+CKsnB

    事件验证:

    /wEWBAK+8ZzHAgKOhZRcApDF79ECAoLc84YMeQ2ayv/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)
    

    ~威廉·赖利·兰德

    8 回复  |  直到 16 年前
        1
  •  18
  •   Chris Van Opstal    17 年前

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

    其他潜在原因:

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

    更新: Microsoft article on the issue 除上述情况外,他们还提出了另外两个潜在原因:

    • 防火墙/防病毒软件对视图状态的修改
    • 从一个aspx页面发布到另一个页面。
        2
  •  9
  •   Jeffrey Harrington    17 年前

    在。NET 3.5 SP1 渲染所有隐藏字段At TopOfForm 属性已添加到PagesSection配置中。

    web.config文件

    <configuration>
    
        <system.web>
    
            <pages renderAllHiddenFieldsAtTopOfForm="true"></pages>
    
        </system.web>
    
    </configuration>
    

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

        3
  •  6
  •   Jon Adams    17 年前

    我在某些特定版本的Safari 3上遇到了这个问题。我的解决方案是将ViewState移动到表单的顶部(扩展Page类并覆盖3.5之前SP1或.Net 3.5 SP1及以后版本的Render方法,默认情况下会这样做),并将ViewState拆分为几个不同的字段,而不是一个怪物文件。 看见 ViewState Chunking in ASP.NET 2.0 (maxPageStateFieldLength)

        4
  •  4
  •   Todd    14 年前

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

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

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

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

    当你看这台机器的关键元素时,突然间你可以看到它在说什么。


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

    我只是猜测,也许 非常相同的服务器 (不在农场)如果由于任何原因“忘记”了它拥有的钥匙,由于任何级别的重置都会将其抹去,则会出现此问题。这也许就是为什么您在空闲期后看到此错误,并尝试使用“过时”页面的原因。

        5
  •  3
  •   Raelshark    17 年前

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

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

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

        6
  •  3
  •   ileon    16 年前

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

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

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

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

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

        7
  •  2
  •   Techgration    17 年前

    当我在页面上设置了一个没有action属性的表单标签时,我遇到了这个错误,然后在后面的代码中,我将表单的action属性更改为“action.aspx”。

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

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

        8
  •  1
  •   MrM    15 年前

    不确定这是否对任何人都有帮助,但我的解决方案是在我的webconfig中排除machineKey,以便传递我的cookie。