【问题标题】:Invalid viewstate for ScriptResource.axd?ScriptResource.axd 的视图状态无效?
【发布时间】:2009-01-26 16:27:49
【问题描述】:

脚本资源和 Web 资源文件在我的应用程序中产生间歇性错误。我一直试图追查问题的原因,但无济于事。我注意到传递的“d”参数有些损坏,我一生都无法弄清楚导致该参数损坏的原因。我注意到我的应用程序中的 JavaScript 代码与为“d”参数生成的哈希码交织在一起。

2009 年 1 月 26 日星期一凌晨 2:20 产生异常 页面位置:/ScriptResource.axd?d=y9_dUwBeGqLlRpT5Dml1zhoQvfa7NKdj69EYuV771kzSsa5KOOXBfJZjk%20%20%20%20%20%20%20%20%20%20%20%20if%20(cat_gallery%20!= 请求的网址:http://garmn.factoryoutletstore.com/ScriptResource.axd?d=y9_dUwBeGqLlRpT5Dml1zhoQvfa7NKdj69EYuV771kzSsa5KOOXBfJZjk if (cat_gallery != 消息:调用的目标已引发异常。 来源:mscorlib 方法:System.Object _InvokeMethodFast(System.Object, System.Object[], System.SignatureStruct ByRef, System.Reflection.MethodAttributes, System.RuntimeTypeHandle) 堆栈跟踪:在 System.RuntimeMethodHandle._InvokeMethodFast(Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner) 在 System.RuntimeMethodHandle.InvokeMethodFast(Object target, Object[] arguments, Signature sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner ) 在 System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfoculture, Boolean skipVisibilityChecks) 在 System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[ ] 参数,CultureInfo 文化)在 System.Reflection.MethodBase.Invoke(Object obj, Object[] 参数) 在 System.Web.Handlers.ScriptResourceHandler.DecryptString(String s) 在 System.Web.Handlers.ScriptResourceHandler.DecryptParameter(NameValueCollection queryString ) 在 System.Web.Handlers.ScriptResourceHandler.ProcessRequest(HttpContext context) 在 System.Web.Handlers.ScriptR esourceHandler.System.Web.IHttpHandler.ProcessRequest(HttpContext context) at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) 内部异常:System.Web.HttpException:无效的视图状态。在 System.Web.UI.Page.DecryptStringWithIV(String s, IVType ivType) 在 System.Web.UI.Page.DecryptString(String s) 用户IP:74.34.62.187 BaseMessage : 2009 年 1 月 26 日星期一凌晨 2:20 产生异常 页面位置:/ScriptResource.axd?d=y9_dUwBeGqLlRpT5Dml1zhoQvfa7NKdj69EYuV771kzSsa5KOOXBfJZjk%20%20%20%20%20%20%20%20%20%20%20%20if%20(cat_gallery%20!= 请求的网址:http://garmn.factoryoutletstore.com/ScriptResource.axd?d=y9_dUwBeGqLlRpT5Dml1zhoQvfa7NKdj69EYuV771kzSsa5KOOXBfJZjk if (cat_gallery != 消息:无效的视图状态。 来源:System.Web 方法:System.String DecryptStringWithIV(System.String, System.Web.Configuration.IVType) 堆栈跟踪:在 System.Web.UI.Page.DecryptString(String s) 的 System.Web.UI.Page.DecryptStringWithIV(String s, IVType ivType) 用户IP:74.34.62.187 用户代理:Mozilla/4.0(兼容;MSIE 8.0;Windows NT 6.0;Trident/4.0;SLCC1;.NET CLR 2.0.50727;.NET CLR 3.0.04506;.NET CLR 1.1.4322;Zune 3.0)

【问题讨论】:

  • 看起来你打破了 SO(无论如何在 chrome 中)
  • J.奥利弗在这里给出了正确答案。

标签: javascript resources viewstate


【解决方案1】:

我一直在分析我收集的数据,并得出了一些结论。我注意到我遇到的大部分错误来自运行 IE 8 或 Firefox 3 的 Windows Vista 计算机。其中也有少数情况是 Vista 和 IE 7。这可以解释为什么错误现在只是随着越来越多的人使用新的操作系统,这成为一个问题。

Mozilla/4.0(兼容;MSIE 8.0;Windows NT 5.1;Trident/4.0;FunWebProducts;.NET CLR 1.1.4322;.NET CLR 2.0.50727) Mozilla/4.0(兼容;MSIE 8.0;Windows NT 5.1;Trident/4.0;GoogleT5;MSN 优化;CA;MSN 优化;CA) Mozilla/4.0(兼容;MSIE 8.0;Windows NT 6.0;WOW64;Trident/4.0;GTB5;SLCC1;.NET CLR 2.0.50727;.NET CLR 3.0.04506;Media Center PC 5.0)

但无论如何,我想得出的结论是,基于这些信息,我开始研究浏览器如何处理 java 脚本,如果有任何新的东西可能导致这个问题,那就是一些有趣的事情突然出现在我身上,我在 w3School 网站上找到了一篇关于 html 与 xhtml 的区别的文章。

HTML 和 XHTML 的区别 HTML 4 和 XHTML 处理脚本中的内容不同:

在 HTML 4 中,内容类型被声明为 CDATA,这意味着不会解析实体。 在 XHTML 中,内容类型被声明为 (#PCDATA),这意味着将解析实体。 这意味着在 XHTML 中,所有特殊字符都应该进行编码,或者所有内容都应该包含在 CDATA 部分中。

要确保脚本在 XHTML 文档中正确解析,请使用以下语法:

因此,我立即查看了我的代码,发现我的某些页面上缺少 DOCTYPE 指令,这些指令与导致问题的相同。我还注意到,在我使用 .NET 注册客户端脚本例程输出 JavaScript 的地方,它会使用 CDATA 属性包装脚本标签的内部内容,而在页面上写入常规 JavaScript 的地方没有使用 CDATA。例如

函数运行我(){ }

我不是浏览器如何呈现或解析 html 返回的专家,但我坚信这与上述情况有关,因为脚本资源请求中的 Url 参数在崩溃时总是包含脚本标记之间的代码在它下面。有时甚至可以在那里找到 html 样式表代码。例如

http://braun.factoryoutletstore.com/ScriptResource.axd?d=70kBR-jPBTx9R89FxObjhipHPS9CMlta5W6ZZiqkaa5zNOXUU4DtsY8V_8functionrunSearchForField(eventObj, id){ if ((eventObj.which == 13) || (eventObj.keyCode == 13)) { var cat_gallery = getParam('gallery'); var cat = getParam('cat') var searchTerm = escape(document.getElementById(id).value); // 必须使用 escape() 函数对搜索词进行 urlencode 以避免出现 '&' 和 '=' 符号的问题 var url;如果(猫_

http://braun.factoryoutletstore.com/ScriptResource.axd?d=9vS7Hk65j_0hD8to_aPDj

现在我的想法是,由于没有在页面中指定任何 DOCTYPE,浏览器可能会尝试根据其接收到的数据进行推断,然后它最终会搞砸,因为有时会有 CDATA,有时会有页面中没有 CDATA。我真的不知道这是否是一个可靠的假设原因,因为他们说假设是危险的。如果有人可以对我的理论有所启发,并让我知道浏览器解析 xhtml 的方式是否与旧版本不同,或者即使它们有任何类似的情况。

【讨论】:

  • 所以要清楚,是否添加了解决它的文档类型?如果是这样,您使用的是什么文档类型?
  • 还是您只是将所有内容都包装在 CDATA 中?还有,如果你使用script标签,使用src而不是把javascript放到页面上,你还会遇到这些问题吗?
【解决方案2】:

我们也遇到过同样的情况,这似乎与 IE8 渲染引擎中的错误有关。

查看以下资源: http://blogs.msdn.com/ieinternals/archive/2009/07/27/Bugs-in-the-IE8-Lookahead-Downloader.aspx http://connect.microsoft.com/IE/feedback/ViewFeedback.aspx?FeedbackID=467062

基本上,页面上有一些标签会导致“解析器重新启动”,从而导致页面中 4K 的 HTML 被忽略。这意味着浏览器将 HTML 放在页面后面 4096 个字节出现的 ScriptResource.axd 上。

【讨论】:

    【解决方案3】:

    好的,欢迎来到 MS ajax 的地狱。

    这点很有趣

    请求的网址: http://garmn.factoryoutletstore.com/ScriptResource.axd?d=y9_dUwBeGqLlRpT5Dml1zhoQvfa7NKdj69EYuV771kzSsa5KOOXBfJZjk if (cat_gallery != 消息:无效 视图状态

    “if (cat_gallery !=”看起来有点不合适。我会查看 if 周围的 javascript,看看是否有任何可疑的地方

    假设您正在使用更新面板,关于无效视图状态的那一点让我认为视图状态在部分请求之间变得无聊。我的猜测(不是基于事实,更多的是经验和痛苦)是它是两件事之一;要么您有多个面板并且状态不正常(面板 1 更新状态,面板 2 立即触发并且不接受更改),或者它与页面生命周期相关(我已经看到多个数据绑定导致部分页面中的无效视图状态回传)

    我想说第一件事是尝试重现错误。转到它发生的页面,并尝试您能想到的每种行为组合。一旦你有一个可重现的错误,附加一个调试器并设置断点,然后单步执行页面生命周期,看看是否有任何代码路径在你没有预料到的方向上徘徊。

    无论哪种方式,MS AJAX 都非常黑盒化,因此调试它的问题可能非常困难(我花了大约 20 个小时来完成我上周刚刚向您推荐的工作)祝您好运,并真心希望这可以帮助您走上正确的道路。

    【讨论】:

    • 我很同情。我已经受够了,我们很可能会切换到 MVC 框架并使用 jQuery 自己完成所有 AJAX。当我花费 5 个小时来解决一个视图状态问题来完成总共需要 20 分钟的事情时,这让我非常生气..
    【解决方案4】:

    我认为这些错误发生在不同的浏览器上的原因不同,这就是很难追踪的原因。

    IE8 错误

    Microsoft 曾表示 IE8 中的错误会(在某些情况下)向服务器生成虚假请求,这些请求不会影响用户,但会导致在服务器端记录错误。

    在此处查看此讨论:Bug IE8 – 4K dropped - "Invalid viewstate" when loading ScriptResource.axd

    ...尤其是 EricLaw-MSFT 的更新,他说:

    值得一提的是,任何在 IE6/IE7 或 Firefox 中遇到问题的人都会遇到与下面描述的 IE8 问题无关的不同问题。

    另见Bugs in IE8's Lookahead Downloader

    他们说更改您设置 Content-Type 的方式将有助于解决一些错误,尽管不是所有错误 - 他们说这是由他们仍在研究的各种模糊环境引起的。

    更新:截至 2010 年 4 月 1 日,这些 IE8 错误已通过 IE8 累积更新 (KB980182) 得到修复。
    这篇文章:IE8 Lookahead Downloader Fixed 提供了有关错误和其他可能的解决方法的更多详细信息,而不是等待世界上的每个人下载修复程序。

    其他浏览器

    还没弄明白,但其他浏览器也会产生这些错误,大概是出于不同的原因。

    网络农场

    此问题不仅限于在网络场上运行的网站,但如果您正在运行一个场,请查看this answer by jesal,这可能会有所帮助

    【讨论】:

      【解决方案5】:

      如果您将网站托管在负载平衡集群或网络场中,则往往会发生这些错误。如果您在该环境中部署应用程序,则必须确保每个服务器上的配置文件共享相同的validationKey 和decryptionKey 值,它们分别用于散列和解密。这是必需的,因为您无法保证哪个服务器会处理连续的请求。

      使用手动生成的键值,设置应类似于以下示例。请确保元素位于 web.config 文件中的部分下方。

      <machineKey validationKey="0BE61B38B9836B541C45728ADB9D93A6FD819169DBB6AD20078A70F474650CC0295C69131E083A6B3762C457BBAF3E66E18F294FDA434B9DD6758631A90A2E20" decryptionKey="B80CC12266B36CCF35EF0708DB5854EDA3BBEBA1A7C89A4E" validation="SHA1"/>
      

      这是一个漂亮的小密钥生成器,您可以使用它来生成密钥值 - http://www.eggheadcafe.com/articles/GenerateMachineKey/GenerateMachineKey.aspx

      所以你可能已经猜到了,ScriptResource.axd 中的 d 参数实际上是解密密钥,当该密钥与之前的请求不匹配时,.NET 框架会抛出一个无效的视图状态错误。

      希望有帮助!

      【讨论】:

      • 我教 d 参数是脚本资源的处理程序类请求的加密程序集名称和版本。
      • 你是对的。我错误地认为 d 参数是解密密钥。通过深入研究,我发现了这个博客——tinyurl.com/5dhqzb,它指出了为什么会发生这些错误的完全不同的原因。虽然我能够通过添加 machineKeys 来修复它们。
      • 嘿,很高兴你把你的修好了。你在运行服务器场吗?问题不是我不认为机器密钥会有所帮助。我注意到问题似乎集中在使用 IE8、FF3、MAC OS X 运行 vista 的机器上。我开始怀疑这些新浏览器中的脚本标签和 xhtml 是否是问题
      • 我的站点在 Win Server 03 负载平衡集群上运行。添加 machineKeys 后,错误停止了。虽然我没有看到任何 JavaScript 代码与 d 参数混合在一起,就像你的情况一样。这确实很奇怪。您是否在 ScriptManager 中使用了 CombinedScripts 处理程序?
      【解决方案6】:

      这可能是一个愚蠢的答案,但是您检查过会话状态管理器吗?默认为 IN PROC,它不适用于网络场,您需要使用 SQL 或其他状态管理器。

      【讨论】:

      • 我排除了网络农场,因为我没有使用它,在初始设置中,系统被设计为在网络农场上工作,但从未完成硬件方面我只在一台服务器上启动,我甚至禁用了网络园艺,所以我认为这不是国家问题。感谢您的建议。
      【解决方案7】:

      嗨,马特,非常感谢您的帮助。 好的,这就是我在分析中注意到的,这个请求似乎总是与相同的 JavaScript 代码交织在一起,我在错误日志中包含了一行,显示了导致问题的请求的 Url。

      /ScriptResource.axd?d=70kBR-jPBTx9R89FxObjhipHPS9CMlta5StoreUrl'%20is%20already%20set.%20*/function%20runSearchForField(eventObj,%20id){%20%20%20%20if%20((eventObj.which %20==%2013)%20||%20(eventObj.keyCode%20==%2013))%20%20%20%20%20{%20%20%20%20%20%20%20 %20var%20cat_gallery%20=%20%20getParam('gallery');%20%20%20%20%20%20%20%20var%20cat%20=%20getParam('cat')%20%20% 20%20%20%20%20%20var%20searchTerm%20=%20escape(document.getElementById(id).value);%20//%20must%20use%20escape()%20function%20to%20urlencode%20search% 20term%20to%20avoid%20issues%20with%20'&'%20and%20'='%20symbols%20%20%20%20%20%20%20%20var%20url;%20%20%20%20 %20%20%20%20%20%20%20%20if%20(cat_gallery%20!=

      如您所见,“d”参数已损坏。这里发生的是 System.Web.UI.Page.DecryptString 在尝试解密此字符串时将引发 Invalid view state 错误。我想知道的是这个字符串怎么会变得如此损坏。我看了一下 JavaScript,对我来说一切都很好,唯一奇怪的是代码中有一些 cmets 用 /* 注释表示该行只是 cmets。我没有使用嵌套面板,但我确实在页面上有一个更新面板。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-01-05
        • 1970-01-01
        • 1970-01-01
        • 2023-03-09
        • 1970-01-01
        相关资源
        最近更新 更多