首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

ASP.NET 崩潰:SiteMap 中瘋狂的迴圈

     編輯:關於ASP.NET

堆疊溢位與迴圈重置:BuildSiteMap 遞迴調用的陷阱

使用者代碼

public override SiteMapNode BuildSiteMap()
{
    for (int i = 0; i < 5; i++)
        myRoot.ChildNodes.Add(new SiteMapNode(this, i.ToString(), i.ToString(), i.ToString()));
    return myRoot;
}

現象

  • 執行即發生 StackOverflowException,伺服器崩潰。
  • 偵錯發現迴圈變數 i 永遠為 0,反覆進入迴圈開頭。

根因分析

  1. 堆疊溢位: 無終止遞迴導致堆疊框架耗盡。
    BuildSiteMap → ChildNodes.Add → 觸發 SiteMap 提供者內部邏輯 → 再次呼叫 BuildSiteMap → ...
  2. 迴圈重置假象: 實際上每次遞迴都是**新的方法呼叫**,各有自己的區域變數 i=0。偵錯器顯示的「重置」實為進入下一層遞迴的新堆疊框架。

類比驗證

void MyRecursiveFunction()
{
    for (int i = 0; i < 5; i++)
        MyRecursiveFunction(); // 斷點處 i 永遠為 0,呼叫堆疊疊加
}

解決方案

  • 在 BuildSiteMap 開頭檢查 if (_siteMapRoot != null) return _siteMapRoot; 快取結果,避免重複建構。
  • 或標記 _isBuilding = true 防止重入。

SiteMap 提供者預設會快取,自訂時**必須自行實作快取**,否則每次存取 SiteMap.RootNode 皆觸發完整建構,導致遞迴災難。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved