Sitemap随着时间的推移随机分解

时间:2010-08-02 17:37:19

标签: asp.net sitemap runtime-error

我一直有一些我不完全理解的生产运行时错误。我们在几个不同的ASP.NET 4.0网站上发生过这种情况( shudders - 是的,我知道 - 我们将它移植到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”的节点,其中roles =“*”(包括公共/匿名访问),所以我很困惑为什么这样做问题发生了。

我考虑过的问题:

  1. SiteMap没有Default.aspx的节点。 所有人都这样做。
  2. 出于安全原因,SiteMap的Default.aspx节点无法访问当前用户/角色。 他们都可以访问匿名用户,这个问题甚至适用于超级管理员用户。
  3. 传入的URL包含查询字符串(Default.aspx?abcd)。 我不知道这是否是一个问题(我肯定不希望)但是一旦问题出现,我就可以手工编写没有查询字符串的URL,问题仍然存在。
  4. SiteMap更改。 它没有
  5. 服务对站点地图文件的权限。 部署后,站点地图工作正常,因此,除非以IISRESET修复的方式更改权限,否则这不是问题。
  6. 工作进程变得全球腐败。 我不这么认为。我们在同一个应用程序池中有大约12个网站,问题总是局限在一个网站内。此外,我们尚未在一个网站上同时发生这种情况,尽管到目前为止它已经在4个不同的网站中体现出来。
  7. 有人可以对此有所了解吗?几乎好像动态编译的SiteMap被破坏了一些东西。我找到的唯一解决方案是IISRESET或同等的。即便如此,也无法解决问题解决的时间。这非常令人沮丧!

3 个答案:

答案 0 :(得分:2)

我在这个被删除的帖子上放了一篇帖子:(无论怎样我都有'同样的问题。

我发现无论我做了什么,“都找不到带有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控制器,早上第一件事就是落后!!)是什么让XmlSiteMapProvider错过了它的异步构建窗口?

真的希望这有帮助。

答案 1 :(得分:0)

嗯。自从我使用ASP.net以来已经有几年了,但是如果我记得的话,我遇到了类似的问题,我解决了这个问题

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

在运行时,站点地图网址将被解析为实际网址,因此会删除波形符并替换为实际网址(我认为:))。

答案 2 :(得分:0)

我有两个可能的想法来解决这个问题。两者都不能保证有效。 ; - )

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

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

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

    我提到这个的原因是我在过去的尝试中遇到了一些麻烦 获取我的站点地图XML 文件中的 roles属性以使其正常工作 使用我在web.config 中的 URL授权中应用的设置。

    我唯一能想到的就是某种竞争条件 负责执行这些政策的流程在哪里 之前在一个地方(web.config)读取一个安全设置 在另一个地方阅读(web.sitemap)。

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

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

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

    这样,您的StartingNodeUrl在ASPX页面本身中指定,如果这确实是Framework代码中的间歇性错误,那么这种轻微的改变可能会解决问题。