一个.NET的web项目,本来运行得非常好的,突然之间报了WebForm_PostBackOptions未定义这么个js错误,然后导致了页面无法PostBack,很严重,很生气。
顺藤摸瓜,毕竟"WebForm_PostBackOptions"这个东西并不是我自己定义的,看样子,有点像微软的东西,于是便摸到了源代码中的这句:
<script src="/WebResource.axd?d=t-9R4BQFzTBoDiiGpxgiTg2&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的映射。
解决方法:
- 要求空间提供商在站点配置填加.axd的映射,但“检查文件是否存在”不能选择。
- 不使用验证控件、不使用以.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没有被正确执行。