我遇到了一些我不完全理解的生产运行时错误。这发生在我们几个不同的 ASP.NET 4.0 网站上(不寒而栗 - 是的,我知道 - 我们正在将它移植到 MVC,但这需要一些时间)。
首先,我们从未能够在开发/QA 环境中重现此问题。其次,在部署时,这个问题似乎不存在。有时问题会在部署后的一两天内出现,而有时部署会持续一个月而根本没有出现。但是,一旦它出现,那么在网站下查看的任何页面都会导致错误。最后,这个问题似乎只有在我们迁移到 .NET 4.0 时才会出现。我们从 2.0 开始,一年前升级到 3.5,最近使用这个解决方案和大多数子项目升级到 4.0。
错误:Could not find the sitemap node with URL '~/Default.aspx'.
我们站点地图的简化版本(更改了一些名称并删除了不感兴趣的节点)如下:
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0">
<siteMapNode roles="*" title="EG">
<siteMapNode url="~/../SM/Default.aspx" title="Welcome" description="" roles="*" />
<siteMapNode url="~/../SD/Default.aspx" title="SD" description="" roles="*" />
<siteMapNode url="~/../SMD/Default.aspx" title="SMD" description="" roles="*" />
<siteMapNode url="~/Default.aspx" title="Ops" description="" roles="*" >
<siteMapNode url="~/Error.aspx" title="Error" hide="true" roles="*" />
<siteMapNode url="~/Public/Login.aspx" hide="true" roles="*" />
<siteMapNode url="~/Manager/LPCE.aspx" title="LPCE" description="" roles="Administrator, Manager, System, Marketer" imageUrl="~/../SM/images/icons/LF.jpg" />
</siteMapNode>
<siteMapNode url="~/../SDD/Default.aspx" title="SDD" description="" roles="*" />
<siteMapNode url="~/../CCD/Default.aspx" title="CCD" description="" roles="*" />
<siteMapNode url="~/../RD/Default.aspx" title="RD" description="" roles="*"/>
<siteMapNode url="~/../SBD/Default.aspx" title="SBD" description="" roles="*" />
</siteMapNode>
</siteMap>
它在我们的 web.config 中注册:
<siteMap defaultProvider="SDXmlSiteMapProvider" enabled="true">
<providers>
<add name="SDXmlSiteMapProvider" type="System.Web.XmlSiteMapProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" siteMapFile="web.sitemap" securityTrimmingEnabled="true" />
<add name="SecurityDisabledSiteMapProvider" type="System.Web.XmlSiteMapProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" siteMapFile="web.sitemap" securityTrimmingEnabled="false" />
</providers>
</siteMap>
从日志中,我缩小了导致错误的原因是在一个基类中,我们几乎所有的页面都来自:
private void Page_Load(object sender, EventArgs e)
{
if(!IsPostBack)
{
SiteMapDataSource.StartingNodeUrl = "~/Default.aspx";
}
}
我已经在所有 SiteMaps 中确认有一个 url="~/Default.aspx"和角色="*"的节点(包括公共(public)/匿名访问),所以我很困惑为什么会出现这个问题。
我考虑过的问题:
任何人都可以对此有所了解吗?看起来好像动态编译的 SiteMap 被损坏了。我发现的唯一分辨率是
IISRESET
或等效的。即便如此,也无法确定问题将在多长时间内得到解决。这非常令人沮丧!
最佳答案
我在该线程上发表了一篇先前的帖子,该帖子已被删除:(无论如何我“遇到”了同样的问题。
我发现无论我做什么,都会发生“找不到带有 URL '~/rootnode 的站点地图节点”。当我决定删除文件系统依赖并切换到 SqlSiteMapProvider
时,我的休息就来了。来自邪恶的代码。我发现这个问题更可靠地重新创建。
简而言之,您会收到该消息,因为没有站点地图!如果您使用 StartingNodeUrl="~/root.htm"
,我发现在站点地图数据源上那么当没有构建站点地图时会出现错误消息。但是,如果您使用 StartingNodeOffset="0"
然后不显示错误消息,并且在未构建站点地图时根本没有呈现菜单。
对我来说似乎很奇怪,但我将其追溯到 XmlSiteMapProvider。有时它建立有时它没有。无法将我的头完全放在引擎盖下,但它看起来像是异步发生的事情。无论如何,我已经从 wickedcode 切换到 SqlSiteMapProvider。
除了转换为 vb 之外,我所做的一项更改是在被覆盖的 BuildSiteMap
的返回上进行递归调用。方法:
' Return the root SiteMapNode
If _Root Is Nothing Then
Return Me.BuildSiteMap
Else
Return _Root
End If
这确保了站点地图的构建。我考虑过放置一个无限递归保护,但似乎不需要。
我仍然在想可能是网络滞后或某种身份验证(在我们这里是通过 AD Controller ,并且在早上第一件事就是滞后!!)是什么让 XmlSiteMapProvider 错过了它的异步构建窗口?
真的希望这会有所帮助。
关于asp.net - 站点地图随时间随机中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3390272/