11

我遇到了一些我不完全理解的生产运行时错误。这在几个不同的 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" 和角色="*" 的节点(包括公共/匿名访问),所以我很困惑为什么会出现这个问题。

我考虑过的问题:

  1. SiteMap 没有 Default.aspx 的节点。他们都这样做。
  2. 出于安全原因,当前用户/角色无法访问 SiteMap 的 Default.aspx 节点。匿名用户都可以访问它们,甚至超级管理员用户也存在这个问题。
  3. 传入的 URL 包含查询字符串 (Default.aspx?abcd)。我不知道这是否是一个问题(我当然希望不是),但是一旦问题出现,我可以手写没有查询字符串的 URL,问题仍然存在。
  4. 站点地图更改。它没有
  5. 服务对站点地图文件的权限。站点地图在部署后可以正常工作,因此除非以 IISRESET 修复的方式更改权限,否则这不是问题。
  6. 工作进程变得全局损坏。我不这么认为。我们在同一个应用程序池中拥有约 12 个网站,而问题始终局限于一个网站。此外,我们还没有一次将这种情况发生在多个网站上,尽管到目前为止它已经在 4 个不同的网站上表现出来。

任何人都可以对此有所了解吗?看起来好像动态编译的 SiteMap 被损坏了。我发现的唯一解决方案是一个IISRESET或等效的。即便如此,也无法确定问题将在多长时间内得到解决。这非常令人沮丧!

4

3 回答 3

2

我在该线程上发表了一篇先前的帖子,该帖子已被删除:(无论如何我“遇到”了同样的问题。

我发现无论我做什么,都会发生“找不到带有 URL '~/rootnode 的站点地图节点”。当我决定删除文件系统依赖并切换到SqlSiteMapProviderfrom wicked code 时,我的休息就来了。我发现这个问题更可靠地重新创建。

简而言之,您会收到该消息,因为没有站点地图!我发现在站点地图数据源上,如果你使用,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 控制器,并且在早上第一件事就是滞后!!)是什么让 XmlSiteMapProvider 错过了它的异步构建窗口?

真的希望这会有所帮助。

于 2012-09-27T09:08:57.400 回答
0

对于这个问题,我有两个可能的想法。两者都不能保证工作。;-)

  1. 您是否可能同时在位于整个 Web 应用程序的各个文件夹中的某些 web.config 文件中使用 URL 授权?

    可以在一个 web.config 文件中找到的示例 URL 授权设置:

    <location path="bobsSecret.aspx"> 
        <system.webServer> 
            <security> 
                <authorization> 
                    <remove users="" roles="BobAndFriends" verbs="" /> 
                    <add accessType="Allow" users="Bob" />          
    
                </authorization> 
            </security> 
        </system.webServer> 
    </location> 
    

    我提到这一点的原因是我过去在尝试让我的站点地图 XML文件中的角色属性与我在 web.config 中的 URL 授权中应用的设置正常工作时遇到了一些麻烦。

    我唯一能想象到的是某种竞争条件,其中负责执行这些策略的过程是在一个地方(web.config)读取一个安全设置,然后在另一个地方(web.sitemap)读取它。

    根据我过去遇到的一些问题,只是在黑暗中刺伤!

  2. 作为第二种选择,您可以考虑将此配置放在您的 aspx 页面中,而不是放在后面代码的 Page_Load 事件中。你可以试试这个:

    <asp:SiteMapDataSource
        id="SiteMapDataSource1"
        runat="server"
        StartingNodeUrl="~/Default.aspx">
    </asp:SiteMapDataSource>
    

    这样,您的 StartingNodeUrl 就在 ASPX 页面本身中指定,如果这确实是框架代码中的间歇性错误,那么这个微小的更改可能会解决问题。

于 2011-09-15T16:37:08.380 回答
0

唔。自从我使用 ASP.net 以来已经有几年了,但如果我记得,我有一个类似的问题,我用它解决了

Page.ResolveURL("~SomePage.aspx");

在运行时,站点地图 url 被解析为实际的 url,因此波浪号被删除并替换为实际的 URL(我认为 :))。

于 2010-11-29T10:06:56.523 回答