Вы не можете прочитать иерархию другого семейства сайтов через PortalSiteMapProvider. Например, если вы находитесь в семействе сайтов A, PSMP будет проходить только по дереву A, а не B. Для перехода по B. вам нужно быть в B *
Обходной путь, который я реализовал, заключался в написании простого веб-сервиса, который работает в семействе сайтов и принимает путь в качестве параметра. Он читает свой собственный PSMP и записывает дерево XML с этой точки в иерархии. Вызывать веб-службу, живущую в SC-B, из кода, выполняемого в SC-A, очень быстро, тем более что PSMP может так быстро прорвать структуру B.
Edit:
Здесь приведены инструкции по созданию веб-службы в WSS3 / MOSS .
Вот некоторый полностью нефункциональный код, который направит вас в правильном направлении:
//method exposed through the web service
public XmlDocument GetTree(string path)
{
PortalSiteMapProvider psmp = PortalSiteMapProvider.GlobalNavSiteMapProvider;
SiteMapNode node = psmp.FindSiteMapNode(path);
return BuildXmlFromNode(node);
}
private XmlNode BuildXmlFromNode(SiteMapNode node)
{
XmlDocument xml = new XmlDocument();
reutrn BuildXmlFromNode(node, xml);
}
//recurses down the sitemapnode children
private XmlNode BuildXmlFromNode(SiteMapNode node, XmlNode xml)
{
XmlElement element = doc.CreateElement("Node")
element.SetAttribute("title", node.Title);
element.SetAttribute("url", node.Url);
xml.AppendChild(element);
foreach(SiteMapNode childNode in node.ChildNodes)
{
BuildXmlFromNode(childNode, element);
}
return xml;
}
Обратите внимание , если вы не установите ограничение на количество рекурсий и иерархия карты вашего сайта очень глубокая и / или широкая, это может привести к ОГРОМНОМУ документу XML. Используйте с осторожностью!