代码之家  ›  专栏  ›  技术社区  ›  Jaxidian

站点地图随时间随机中断

  •  11
  • Jaxidian  · 技术社区  · 14 年前

    我一直有一些生产运行时错误,我不完全理解。我们在几个不同的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";
       }
    }
    

    我已经在所有的站点地图中确认有一个url为“~/default.aspx”且roles为“*”(包括公共/匿名访问)的节点,所以我很困惑为什么会出现这个问题。

    我考虑过的问题:

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

    有人能解释一下吗?看起来好像动态编译的站点地图被破坏了什么的。我找到的唯一解决办法是 IISRESET 或同等的。即便如此,这个问题还能解决多久也无从得知。这太令人沮丧了!

    3 回复  |  直到 14 年前
        1
  •  2
  •   Jack Ishu    12 年前

    我在这篇被删除的帖子上放了一篇文章:(无论如何我也有同样的问题。

    我发现无论我做什么,都会发生“找不到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
    

    这确保了站点地图的构建。我曾考虑过加入一个无限递归保护,但似乎并不需要。

    我仍然在想,也许是网络延迟或某种身份验证(在我们这里是通过一个广告控制器进行的,在早上的第一件事就是延迟!)!)是什么让xmlsitemapprovider错过了异步构建窗口?

    真希望这能有帮助。

        2
  •  0
  •   Kell    14 年前

    嗯。自从我在asp.net工作以来已经有几年了,但是如果我还记得的话,我有一个类似的问题,我用它解决了

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

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

        3
  •  0
  •   Jason Parker    13 年前

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

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

      示例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>
      

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