11

脚本资源和 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。在 System.Web.Handlers.ScriptResourceHandler.System.Web.IHttpHandler.ProcessRequest(HttpContext context) 在 System.Web.Handlers.ScriptResourceHandler.ProcessRequest(HttpContext context) 在 System.Web.HttpApplication.CallHandlerExecutionStep.System 的 DecryptParameter(NameValueCollection queryString)。 Web.HttpApplication.IExecutionStep.Execute() 在 System.Web.HttpApplication.ExecuteStep(IExecutionStep 步骤,布尔值&完成同步)同步完成)同步完成)
内部异常: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)
4

7 回答 7

5

我一直在分析我收集的数据,并得出了一些结论。我注意到我遇到的大部分错误来自运行 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;媒体中心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。例如

函数 RunMe() { }

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

http://braun.factoryoutletstore.com/ScriptResource.axd?d=70kBR-jPBTx9R89FxObjhipHPS9CMlta5W6ZZiqkaa5zNOXUU4DtsY8V_8function runSearchForField(eventObj, id){ if ((eventObj.which == 13) || (eventObj.keyCode == 13)) { var cat_gallery = getParam('画廊'); 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 的方式是否与旧版本不同,或者即使它们有任何类似的情况。

于 2009-02-03T15:44:16.320 回答
4

我们也遇到过同样的情况,这似乎与 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 上。

于 2009-10-23T16:04:59.253 回答
1

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

这一点很有趣

请求的网址: http ://garmn.factoryoutletstore.com/ScriptResource.axd?d=y9_dUwBeGqLlRpT5Dml1zhoQvfa7NKdj69EYuV771kzSsa5KOOXBfJZjk if (cat_gallery != Message: Invalid viewstate

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

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

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

无论哪种方式,MS AJAX 都是非常黑箱的,因此调试它周围的问题可能非常困难(我花了大约 20 个小时做我上周刚刚向您推荐的事情)祝您好运,并真的希望这对您有所帮助走上正确的道路。

于 2009-01-26T16:51:09.347 回答
1

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

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

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

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

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

希望有帮助!

于 2009-01-26T19:30:48.667 回答
1

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

IE8 错误

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

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

...特别是 EricLaw-MSFT 的更新,他说:

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

另请参阅IE8 的 Lookahead Downloader 中的错误

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

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

其它浏览器

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

网络农场

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

于 2009-11-04T14:01:14.913 回答
0

嘿马特非常感谢你的帮助。好的,这就是我在分析中注意到的,这个请求似乎总是与相同的 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,对我来说一切都很好,唯一奇怪的是代码中有一些注释是用 /* 注释的,表示该行只是注释。我没有使用嵌套面板,但我确实在页面上有一个更新面板。

于 2009-01-26T18:57:38.547 回答
0

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

于 2009-01-28T02:49:21.480 回答