代码改变世界

[.axd]“WebForm_PostBackOptions未定义”及其他相关问题的相关解决方法

2010-03-28 18:24  uonun  阅读(757)  评论(0编辑  收藏  举报

一个.NET的web项目,本来运行得非常好的,突然之间报了WebForm_PostBackOptions未定义这么个js错误,然后导致了页面无法PostBack,很严重,很生气。

顺藤摸瓜,毕竟"WebForm_PostBackOptions"这个东西并不是我自己定义的,看样子,有点像微软的东西,于是便摸到了源代码中的这句:

<script src="/WebResource.axd?d=t-9R4BQFzTBoDiiGpxgiTg2&amp;t=633898576145000000"
type="text/javascript"></script>

相信做.NET的同仁已经对这句代码都习惯了,这个是微软自动生成的动态JS文件,用于支持ASP.NET中WebForm的一些基本代码。但今天的问题就恰好出在这里,我直接在浏览器访问这个地址,果然,产生了服务器异常,JS根本就没有输出出来。(以下异常由uoLib输出

"/" 应用程序中的服务器错误。
Stack<Exception>[0]:
Specified argument was out of the range of valid values. Parameter name: utcDate
类型(Exception.GetType()) :System.ArgumentOutOfRangeException
来源(Exception.Source) :System.Web
方法(Exception.TargetSite) :Void UtcSetLastModified(System.DateTime utcDate)
类对象(Exception.TargetSite.ReflectedType) :System.Web.HttpCachePolicy

看样子,问题是出在时间上。而代码是微软的,没道理就这么随随便便错了。于是检查了一下服务器时间,靠,2008年?整整迟了一年?OK,将服务器时间调整过来,仅这一下,页面居然就一切正常了!

总结:

根据现象猜想,这段代码应该有一个缓存的机制。在一定时间之内多次访问这个页面时,这段JS会直接使用服务器缓存。于是,当原本的缓存过期,服务器时间却又调到了很久以前,那么“愚蠢”的事情就发生了——调用时根据服务器时间判断,可以调用缓存,而缓存里却已经没有了这段JS的对象。于是乎,后面报的“WebForm_PostBackOptions未定义”这个错误就自然而然了。

扩展:其他相关问题的相关解决方法:

如下是在网络上搜到的。(有时候之所以我们按照网上的方法照着做也解决不了问题,就是因为没有找到问题产生的根本原因。下面这些,虽然表现均为“WebForm_PostBackOptions未定义”,但产生问题的原因却大相径庭。)

一、一些服务器空间提供商在对ASP.NET的安全处理措施上,去掉了一些默认的映射,以保证服务器尽可能的少受入侵攻击和潜在的安全漏洞的威胁。

比如我们需要的扩展名:.axd  与 C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll的映射。

解决方法:

  1. 要求空间提供商在站点配置填加.axd的映射,但“检查文件是否存在”不能选择。
  2. 不使用验证控件、不使用以.axd支持的.NET Ajax……囧

二、其他一些.NET默认生成的JS里面的方法、对象未定义的错误;以.axd支持的.NET Ajax框架中产生的某些方法、对象未定义的错误。

以下列出了/WebResource.axd里的方法:

  • WebForm_DoPostBackWithOptions
  • WebForm_PostBackOptions
  • WebForm_DoCallback
  • WebForm_CallbackComplete
  • WebForm_ExecuteCallback
  • WebForm_FillFirstAvailableSlot
  • WebForm_InitCallback
  • WebForm_InitCallbackAddField
  • WebForm_EncodeCallback
  • WebForm_ReEnableControls
  • WebForm_ReDisableControls
  • WebForm_FireDefaultButton
  • WebForm_GetScrollX
  • WebForm_GetScrollY
  • WebForm_SaveScrollPositionSubmit
  • WebForm_SaveScrollPositionOnSubmit
  • WebForm_RestoreScrollPosition
  • WebForm_TextBoxKeyHandler
  • WebForm_AppendToClassName
  • WebForm_RemoveClassName
  • WebForm_GetElementById
  • WebForm_GetElementByTagName
  • WebForm_GetElementsByTagName
  • WebForm_GetElementDir
  • WebForm_GetElementPosition
  • WebForm_GetParentByTagName
  • WebForm_SetElementHeight
  • WebForm_SetElementWidth
  • WebForm_SetElementX
  • WebForm_SetElementY

扩展总结:

这个问题的根本原因是.axd没有被正确执行。