2010-08-02 100 views
11

我一直有一些生产运行时错误,我不完全理解。这发生在我们两个不同的ASP.NET 4.0网站上(不寒而栗 - 是的,我知道 - 我们将它移植到MVC,但这需要一些时间)。Sitemap随着时间的推移而随机分布

首先,我们从来没有能够在开发/质量保证环境中重现此问题。其次,部署后,这个问题似乎是不存在的。有时候这个问题会在部署的一两天内展现出来,而其他时间部署将会持续一个月而不会显示出来。但是,一旦它出现,那么在网站下查看的任何页面都会导致错误。最后,这个问题似乎只有在我们迁移到.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> 

而从日志我已经缩小了是什么原因导致错误是在一个基类几乎所有我们的p年龄从派生:

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

我已确认在所有的Sitemaps存在与URL =“〜/ Default.aspx的”与角色的节点=“*”(包括公共/匿名访问),所以我很困惑,为什么会出现这个问题。

的问题我也考虑过:

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

任何人都可以对此有所了解吗?它几乎看起来好像动态编译的SiteMap被损坏或什么的。我发现的唯一解决方案是IISRESET或同等产品。即使如此,也不知道问题能够解决多久。这非常令人沮丧!

+0

托管在哪个服务器上? – 2010-08-02 17:45:44

+0

赢2003 R2标准 – Jaxidian 2010-08-02 18:57:33

+0

我们仍然有这个问题,并仍然想有这个答案... – Jaxidian 2010-11-22 13:06:28

回答

0

嗯。它是一个几年以来我与ASP.net的工作,但如果我还记得,我有我与

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

在运行时的Sitemap网址解析为实际的URL解决了类似的问题,所以波浪被删除并替换为实际的URL(我认为:))。

+0

我必须给出这个镜头 - 谢谢! – Jaxidian 2010-11-29 14:26:50

+0

顺便说一句,这从来没有帮助过我。 – Jaxidian 2011-03-18 22:33:23

+0

那么你自己解决了吗?如果是这样,其他人可能对知道如何感兴趣。就像我说的,它已经有一段时间了。 – Kell 2011-03-24 10:03:30

0

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

  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文件正常工作 与我已应用于我的URL授权中的设置在web.config中。

    我能想象到的唯一的事情将是某种形式的竞争条件 其中负责执行这些政策的过程 读一个安全设置在一个地方(的web.config) 之前在另一个地方(网络阅读它。网站地图)。

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

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

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

    你StartingNodeUrl在ASPX页面本身指定这样一来,如果这是真正的框架代码间歇性的错误,也许这细微的变化可能会解决问题。

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错过它的异步生成窗口?

真希望这会有所帮助。

相关问题