查出某支 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 導致全站出錯,就不會手忙腳亂了。