ASP.NET 崩溃-SiteMap中疯狂的循环(4) 021630ec 0f765641 (MethodDesc 0xfa42328 +0x59 ViewSiteMapProvider.BuildSiteMap())0216311c 686b5cdf (MethodDesc 0x68b03720 +0x2f System.Web.StaticSiteMapProvider.GetChildNodes(System.Web.SiteMapNode))02163154 686b1fc4 (MethodDesc 0x68aeff30 +0x18 System.Web.SiteMapNode.get_ChildNodes())0216315c 0f765641 (MethodDesc 0xfa42328 +0x59 ViewSiteMapProvider.BuildSiteMap())...
好了,这看起来问题出自ChildNodes属性。使用该属性时,会调用GetChildNodes 函数,这个函数会再次调用BuildSiteMap 函数,从而它又调用了ChildNodes 属性,如此一直下去,导致了堆栈溢出。
结论
在关于BuildSitemap的文档中,你能找到如下段落: BuildSiteMap 方法由 FindSiteMapNode、GetChildNodes和GetParentNode方法的默认实现调用。如果在派生类中重写 BuildSiteMap 方法,请确保它仅加载一次站点地图数据,并在后续调用中返回。 为了避免出现递归和堆栈溢出,最好避免调用该方法,像在BuildSiteMap例子里,我们可以用AddNode方法来添加子节点。 这在归档在Site Map Providers这篇文章中,该文同样值得一读。 BuildSiteMap 一般不应当调用其他的site map提供的方法或属性,因为许多方法和属性默认会实现BuildSiteMap调用。 例如,BuildSiteMap中的RootNode会引起递归,从而使之以堆栈溢出而终止。