问题 ScriptResource.axd的viewstate无效?


脚本资源和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 []参数,SignatureStruct&sig,MethodAttributes methodAttributes,RuntimeTypeHandle typeOwner)处于System.RuntimeMethodHandle.InvokeMethodFast(Object target,Object []参数,Signature sig,MethodAttributes methodAttributes,RuntimeTypeHandle typeOwner )System.Reflection.RuntimeMethodInfo.Invoke(Object obj,BindingFlags invokeAttr,Binder binder,Object []参数,CultureInfo culture,Boolean skipVisibilityChecks)在System.Reflection.RuntimeMethodInfo.Invoke(Object obj,BindingFlags invokeAttr,Binder binder,Object [ System.Web.Handlers.ScriptResourceHandler.DecryptParameter(NameValueCollection queryString)上的System.Web.Handlers.ScriptResourceHandler.DecryptString(String s)中System.Reflection.MethodBase.Invoke(Object obj,Object []参数)的参数,CultureInfo文化) )System.Web.Handlers.ScriptR上的System.Web.Handlers.ScriptResourceHandler.ProcessRequest(HttpContext context) System.Web.HttpApplication.ExecuteStep上的System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()中的esourceHandler.System.Web.IHttpHandler.ProcessRequest(HttpContext context)(IExecutionStep step,Boolean&completedSynchronously)
内部异常:System.Web.HttpException:无效的viewstate。 System.Web.UI.Page.DecryptString(String s)上的System.Web.UI.Page.DecryptStringWithIV(String s,IVType ivType)
用户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)

2862
2018-01-26 16:27


起源

看起来你打破了SO(无论如何都是镀铬) - Matt Briggs
J. Oliver在这里给出了正确的答案。 - EricLaw


答案:


我一直在分析我收集的数据,并得出了一些结论。我注意到我所获得的大部分错误来自运行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与旧版本不同,或者即使它们有任何类似的情况。


5
2018-02-03 15:44



这已经解决了我的问题,希望对其他人有益。 - JamTech
所以要明确的是,它是否添加了解决它的doctype?如果是这样,你使用了什么doctype? - Brian MacKay
或者你只是把所有内容都包装在CDATA中?而且,如果你使用脚本标签并使用src而不是将javascript放在页面上,你还会遇到这些问题吗? - Brian MacKay


我们经历过相同的情况,它似乎与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字节后发生。


4
2017-10-23 16:04





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

这一点很有趣

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

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

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

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

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


1
2018-01-26 16:51



我同情。我厌倦了,我们很可能会转而使用MVC框架并使用jQuery自行完成所有AJAX。当我花5个小时解决一个视图状态问题来做一些总共需要20分钟的事情时,这让我非常生气。 - gregmac


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

IE8错误

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

在这里看到这个讨论: 错误IE8 - 4K被删除 - 加载ScriptResource.axd时“无效的viewstate”

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

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

也可以看看 IE8的Lookahead Downloader中的错误

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

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

其它浏览器

尚未弄清楚,但其他浏览器也会产生这些错误,大概是出于不同的原因。

网络农场

此问题不仅限于在Web场上运行的站点,但如果您正在运行场,请检查 这个答案是耶稣的 这可能有所帮助


1
2017-11-04 14:01





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

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

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

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

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

希望有所帮助!


1
2018-01-26 19:30



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


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


0
2018-01-28 02:49



我排除了网络农场,因为我没有使用它,在初始设置中系统正在设计在网络农场工作,但它从未完成硬件方面我只在一台服务器上启动,我甚至禁用了网络园艺,所以我不要以为是国家问题。谢谢你的建议。 - JamTech


嘿马特非常感谢你的帮助。 好的,这就是我的注意事项在我的分析中,这个请求似乎总是与相同的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( '画廊');%20%20%20%20%20%20%20%20var%20cat%20 =%20getParam( '猫')%20%20%20%20 %20%20%20%20var%20searchTerm%20 =%20escape(的document.getElementById(ID)。价值);%20 //%20must%20use%20escape()%20function%20to%20urlencode%20search%20term%20to %20avoid%20issues%20with%20 '和' %20于是%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,一切似乎都没问题,唯一奇怪的是代码中有一些注释用/ *注释表示该行只是注释。我没有使用嵌套面板,但我在页面上有一个更新面板。


0
2018-01-26 18:57