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

Jax*_*ian 11 sitemap asp.net runtime-error

我一直有一些我不完全理解的生产运行时错误.我们在几个不同的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>
Run Code Online (Sandbox Code Playgroud)

它在我们的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>
Run Code Online (Sandbox Code Playgroud)

从日志中我缩小了导致错误的原因是基类中几乎所有页面都来自:

private void Page_Load(object sender, EventArgs e)
{
   if(!IsPostBack)
   {
        SiteMapDataSource.StartingNodeUrl = "~/Default.aspx";
   }
}
Run Code Online (Sandbox Code Playgroud)

我已经在所有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个不同的网站中体现出来.

任何人都可以对此有所了解吗?几乎好像动态编译的SiteMap被破坏了一些东西.我发现的唯一解决方案是一个IISRESET或同等的.即便如此,也无法解决问题解决的时间.这非常令人沮丧!

Kel*_*ell 0

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

Page.ResolveURL("~SomePage.aspx");
Run Code Online (Sandbox Code Playgroud)

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