查出某支 JavaScript 有錯,修改後更新到網站,沒想到整個 ASP.NET MVC 網站壞光光,所有 View 都無法顯示,出現如下錯誤:

'/' 應用程式中發生伺服器錯誤。

並未將物件參考設定為物件的執行個體。

描述: 在執行目前 Web 要求的過程中發生未處理的例外狀況。請檢閱堆疊追蹤以取得錯誤的詳細資訊,以及在程式碼中產生的位置。

例外狀況詳細資訊: System.NullReferenceException: 並未將物件參考設定為物件的執行個體。

原始程式錯誤:


行 14:     <div>
行 15:     </div>
行 16:     @Scripts.Render("~/bundles/test")
行 17: </body>
行 18: </html>

原始程式檔: E:\Lab\WebAp\Views\Home\Index.cshtml    行: 16

堆疊追蹤:


[NullReferenceException: 並未將物件參考設定為物件的執行個體。]
   Microsoft.Ajax.Utilities.OutputVisitor.Visit(CallNode node) +373
   Microsoft.Ajax.Utilities.CallNode.Accept(IVisitor visitor) +18
   Microsoft.Ajax.Utilities.OutputVisitor.Visit(Block node) +405
   Microsoft.Ajax.Utilities.Block.Accept(IVisitor visitor) +18
   Microsoft.Ajax.Utilities.OutputVisitor.OutputFunctionArgsAndBody(FunctionObject node, Boolean removeUnused) +899
   Microsoft.Ajax.Utilities.OutputVisitor.Visit(FunctionObject node) +603
   Microsoft.Ajax.Utilities.FunctionObject.Accept(IVisitor visitor) +18
   Microsoft.Ajax.Utilities.OutputVisitor.Visit(Block node) +405
   Microsoft.Ajax.Utilities.Block.Accept(IVisitor visitor) +18
   Microsoft.Ajax.Utilities.OutputVisitor.Apply(TextWriter writer, AstNode node, CodeSettings settings) +74
   Microsoft.Ajax.Utilities.Minifier.MinifyJavaScript(String source, CodeSettings codeSettings) +545
   System.Web.Optimization.JsMinify.Process(BundleContext context, BundleResponse response) +92
   System.Web.Optimization.Bundle.ApplyTransforms(BundleContext context, String bundleContent, IEnumerable`1 bundleFiles) +273
   System.Web.Optimization.Bundle.GenerateBundleResponse(BundleContext context) +141
   System.Web.Optimization.Bundle.GetBundleResponse(BundleContext context) +45
   System.Web.Optimization.BundleResolver.GetBundleContents(String virtualPath) +166
   System.Web.Optimization.AssetManager.DeterminePathsToRender(IEnumerable`1 assets) +205
   System.Web.Optimization.AssetManager.RenderExplicit(String tagFormat, String[] paths) +35
   System.Web.Optimization.Scripts.RenderFormat(String tagFormat, String[] paths) +107
   System.Web.Optimization.Scripts.Render(String[] paths) +21
   ASP._Page_Views_Home_Index_cshtml.Execute() in E:\Lab\WebAp\Views\Home\Index.cshtml:16

從來沒想過更新 JS 會讓整個網站掛點,起初以為是剛才更新 JS 時無意間動到什麼才搞壞系統,但反覆檢查後排除各種可能,直到將 JS 檔還原,系統立即恢復正常。嗯,我確定了一件事:有問題的 JS 的確有可能讓 ASP.NET MVC 網站的所有 View 壞光光!

回頭檢查剛才更新的 JS,發現我做了一件很豬頭的事,一時眼花誤把 TypeScript 當 JavaScript 複寫 JS 檔才搞飛機。因此,問題範圍進一步縮小到「 JS 出現 TypeScript 語法導致 ScriptBundle Crash」。在開發機重現問題並用消刪去法反覆測試過濾,找出是 "blah[]" 寫法踩到 ScriptBundle Minifier 元件(Microsfot.Ajax.Utilities.Minifier)的Bug,讓 ScrptBundle Render 出錯,當出錯點在全站共用的 Layout cshtml,所有的 View 就會一次壞光光。

//test.js
function test() {
    a[];
}

直接傳入 "a[]" 給 MinifyJavaScript() 引發一模一樣的錯誤,證實了我的推論。

由此經驗,日後再遇更新 JS 導致全站出錯,就不會手忙腳亂了。


Comments

Be the first to post a comment

Post a comment