DefaultSiteMapProvider返回空的站点地图,即使Mvc.sitemap已被处理

本文关键字:sitemap Mvc 处理 即使 返回 站点 地图 DefaultSiteMapProvider | 更新日期: 2023-09-27 18:01:07

MvcSiteMapProvider项目有问题:我的站点地图总是空的。

我已经设置了一个Mvc.sitemap,设置了web.config条目。通过DefaultSiteMapProvider进行调试表明.sitemap文件已读取并得到正确处理。然而,返回的站点地图基本上是空的:

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
    <url>
        <loc>
            http://localhost:59933/
        </loc>
    </url>
</urlset>

然而,在执行代码时会发生一件奇怪的事情。我遍历DefaultSiteMapProvider并观察root变量中的根节点。在方法接近尾声时,根节点在设置isBuildingSiteMap = false时重置为空节点。我不知道这可能会如何影响根节点的设置,但在我的项目中,这种情况总是发生。

如有任何关于如何防止root节点被覆盖的帮助,我们将不胜感激。:(


来自DefaultSiteMapProvider的注释摘录,接近BuildSiteMap方法(ll.660 ff(的末尾:

HttpContext.Current.Cache.Add(/*...*/); // At this point the root node is correct
isBuildingSiteMap = false; // after executing this line, `root` gets reset to an empty node.
siteMapXml = null;

Mvc.sitemap:

<mvcSiteMap [...]>
  <mvcSiteMapNode title="Home" controller="Home" action="Index">
    <mvcSiteMapNode title="Test" controller="Listing" action="Index">
  </mvcSiteMapNode>
</mvcSiteMap>

web.config条目直接来自文档页面,仅根据站点地图名称进行了调整。

DefaultSiteMapProvider返回空的站点地图,即使Mvc.sitemap已被处理

我犯的错误与将DefaultNamespaces添加到ControllerBuilder有关。虚线是:

ControllerBuilder.Current.DefaultNamespaces.Add("My.Framework.Web");

应该是:

ControllerBuilder.Current.DefaultNamespaces.Add("My.Framework.Web.Controllers");

MVC从未抱怨过这一点,并且很高兴地找到了我的控制器。

然而,一旦站点地图的构建完成,DefaultSiteMapProvider的行为就会有所不同,因为IsAccessibleForUser((突然成为决定ChildNodes的一个因素。默认提供程序检查是否可以找到节点的控制器,并且不查找子命名空间(除非命名空间以.*结尾,参见MvcSiteMapProvider.DefaultControllerTypeResolver.IsNamespaceMatch(string requestedNamespace, string targetNamespace)(。

因为我没有使用通配符,但认为MVC工作时网站地图会起作用,这让我很恼火。