ScriptResource.axd的viewstate无效?

时间:2009-01-26 16:27:50

标签: javascript resources viewstate

脚本资源和Web资源文件在我的应用程序中生成间歇性错误。我一直试图追逐问题的原因,但无济于事。我注意到传递的“d”参数是一些损坏程度,我不能为我的生活弄清楚是什么导致这个参数被破坏。我注意到在我的应用程序中的JavaScript代码是如何与为“d”参数生成的哈希代码交织在一起的。

Exception genereated on Monday, January 26, 2009, at 2:20 AM
Page location: /ScriptResource.axd?d=y9_dUwBeGqLlRpT5Dml1zhoQvfa7NKdj69EYuV771kzSsa5KOOXBfJZjk%20%20%20%20%20%20%20%20%20%20%20%20if%20(cat_gallery%20!=
Requested Url : http://garmn.factoryoutletstore.com/ScriptResource.axd?d=y9_dUwBeGqLlRpT5Dml1zhoQvfa7NKdj69EYuV771kzSsa5KOOXBfJZjk if (cat_gallery !=
Message: Exception has been thrown by the target of an invocation.
Source: mscorlib
Method: System.Object _InvokeMethodFast(System.Object, System.Object[], System.SignatureStruct ByRef, System.Reflection.MethodAttributes, System.RuntimeTypeHandle)
Stack Trace: at System.RuntimeMethodHandle._InvokeMethodFast(Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner) at System.RuntimeMethodHandle.InvokeMethodFast(Object target, Object[] arguments, Signature sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner) at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks) at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) at System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters) at System.Web.Handlers.ScriptResourceHandler.DecryptString(String s) at System.Web.Handlers.ScriptResourceHandler.DecryptParameter(NameValueCollection queryString) at System.Web.Handlers.ScriptResourceHandler.ProcessRequest(HttpContext context) at System.Web.Handlers.ScriptResourceHandler.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)
Inner Exception: System.Web.HttpException: Invalid viewstate. at System.Web.UI.Page.DecryptStringWithIV(String s, IVType ivType) at System.Web.UI.Page.DecryptString(String s)
User IP: 74.34.62.187

BaseMessage : Exception genereated on Monday, January 26, 2009, at 2:20 AM
Page location: /ScriptResource.axd?d=y9_dUwBeGqLlRpT5Dml1zhoQvfa7NKdj69EYuV771kzSsa5KOOXBfJZjk%20%20%20%20%20%20%20%20%20%20%20%20if%20(cat_gallery%20!=
Requested Url : http://garmn.factoryoutletstore.com/ScriptResource.axd?d=y9_dUwBeGqLlRpT5Dml1zhoQvfa7NKdj69EYuV771kzSsa5KOOXBfJZjk if (cat_gallery !=
Message: Invalid viewstate.
Source: System.Web
Method: System.String DecryptStringWithIV(System.String, System.Web.Configuration.IVType)
Stack Trace: at System.Web.UI.Page.DecryptStringWithIV(String s, IVType ivType) at System.Web.UI.Page.DecryptString(String s)
User IP: 74.34.62.187
User Agent: Mozilla/4.0 (compatible; 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)

7 个答案:

答案 0 :(得分: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; 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。例如

  函数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('gallery'); var cat = getParam('cat')var searchTerm = escape(document.getElementById(id).value); //必须使用escape()函数来urlencode搜索词以避免'&'的问题和'='符号var url; if(cat _

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

现在我想的是,因为我没有在页面中指定任何DOCTYPE,浏览器可能会根据其接收的数据进行推断,然后它最终会搞乱,因为有时会有CDATA而且是页面中没有CDATA的时间。我不知道这是否是一个可靠的假设原因,因为他们认为假设是危险的。如果有人能够对我的理论有所了解,请告诉我浏览器是否正在解析xhtml与旧版本的解析方式不同,或者即使他们有类似的情况。

答案 1 :(得分: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放在ScriptResource.axd上,该页面在4096字节后发生。

答案 2 :(得分:1)

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

这一点很有意思

  

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

“if(cat_gallery!=”看起来有点不合适。我会看看周围的javascript,看看是否有什么看起来很可疑

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

我想说的是首先要尝试重现错误。转到它发生的页面,尝试您能想到的每种行为组合。一旦你有一个可重现的bug,附上一个调试器并将断点全部放在一起,然后只需逐步执行页面生命周期,看看是否有任何代码路径在你没预料到的方向上徘徊。

无论哪种方式,MS AJAX都是非常黑盒子的,所以围绕它的调试问题可能会非常困难(上周我花了大约20个小时做我刚推荐给你的)我祝你好运,并且真的希望这有助于你走正确的道路。

答案 3 :(得分:1)

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

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

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

这是一个漂亮的小键生成器,可用于生成键值 - http://www.eggheadcafe.com/articles/GenerateMachineKey/GenerateMachineKey.aspx

正如您可能已经猜到的那样,ScriptResource.axd中的d参数实际上是解密密钥,当该密钥与先前的请求不匹配时,.NET框架将抛出​​无效的视图状态错误。

希望有所帮助!

答案 4 :(得分:1)

我认为这些错误是由于不同的原因而在不同的浏览器中发生的,这使得追踪变得如此困难。

IE8 Bug

微软已经表示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 :(得分: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在尝试解密此字符串时将抛出无效视图状态错误。我想知道的是这个字符串怎么会变得腐败。我看了一下JavaScript,一切似乎都没问题,唯一奇怪的是代码中有一些注释用/ *来表示该行只是注释。我没有使用嵌套面板,但我在页面上有一个更新面板。

答案 6 :(得分:0)

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