SharePoint. Получение списка сайтов
В SharePoint 2016 был расширен набор свойств класса SPWebInfo, что позволяет получать иерархию сайтов.
Без SPWebInfo
Без использования SPWebInfo получить список всех сайтов для коллекции сайтов можно вот так:
using (var site = new SPSite(siteUrl))
{
var webs = site
.AllWebs
.ToList();
foreach(var web in webs)
{
//TODO: processing the web
web.Dispose(); // Dispose
}
}
Неудобство заключается в том, что SPWeb реализует интерфейс IDisposable и необходимо вызывать его метод Dispose. К тому же большинство свойств будут выбираться из базы при чтении их. Приведенный код выше порождает вызов всего двух хранимых процедур:
Но стоит добавить вывод свойства ParentWebId:
foreach(var web in webs)
{
//TODO: processing the web
Console.WriteLine(web.ParentWebId.ToString("B"));
}
И кол-во вызовов увеличится пропорционально количеству сайтов:
SPWebInfo
Чтобы этого избежать и минимизировать нагрузку на систему получить список всех сайтов в коллекции сайтов необходимо использовать свойство SPWebCollection.WebsInfo:
using (var site = new SPSite(siteUrl))
{
var webs = site
.AllWebs
.WebsInfo //SPWebInfo
.ToList();
foreach(var web in webs)
{
//TODO: processing the web
}
}
В SharePoint 2013 кол-во свойств было недостаточным. Нельзя было получить ни идентификатор родительского сайта, ни идентификатор коллекции сайтов. Иерархию приходилось выстраивать почти интуитивно (по URL-адресам).
Теперь же в SharePoint 2016 можно с легкостью получить список дочерних сайтов:
using (var site = new SPSite(siteUrl))
{
// ID родительского сайта
var parentId = new Guid("{1e71a3ea-9981-4e17-b6a2-ac6586981d02}");
var webs = site
.AllWebs
.WebsInfo // SPWebInfo
.ToList()
.Where(x => x.ParentWebId == parentId) // Фильтрация
.OrderBy(x => x.Title); // Сортировка
foreach(var web in webs)
{
//TODO: processing the web
}
}
JSOM и REST
В JSOM и в REST API SharePoint 2016 Release Candidate набор свойств объекта SP.WebInformation, соответствующих SPWebInfo, не изменился.
SP.WebInformation:
REST. Запрос по адресу вида /_api/web/webinfos:
<?xml version="1.0" encoding="utf-8"?>
<feed>
<id>b226f1fc-6bd4-4006-b71a-417b437d56bf</id>
<title />
<updated>2016-02-07T21:50:35Z</updated>
<entry>
<id>http://spserver/_api/SP.WebInformation2c59d10c-0c53-4a34-bbe6-7198af1e821e</id>
<category term="SP.WebInformation" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />
<link rel="edit" href="SP.WebInformation2c59d10c-0c53-4a34-bbe6-7198af1e821e" />
<title />
<updated>2016-02-07T21:50:35Z</updated>
<author>
<name />
</author>
<content type="application/xml">
<m:properties>
<d:Configuration m:type="Edm.Int16">0</d:Configuration>
<d:Created m:type="Edm.DateTime">2016-02-05T20:41:55Z</d:Created>
<d:Description></d:Description>
<d:Id m:type="Edm.Guid">1e71a3ea-9981-4e17-b6a2-ac6586981d02</d:Id>
<d:Language m:type="Edm.Int32">1033</d:Language>
<d:LastItemModifiedDate m:type="Edm.DateTime">2016-02-05T20:42:05Z</d:LastItemModifiedDate>
<d:ServerRelativeUrl>/Departments</d:ServerRelativeUrl>
<d:Title>Departments</d:Title>
<d:WebTemplate>STS</d:WebTemplate>
<d:WebTemplateId m:type="Edm.Int32">0</d:WebTemplateId>
</m:properties>
</content>
</entry>
</feed>
К релизу может быть эта ситуация будет исправлена.
PowerShell
В PowerShell ситуация аналогична SSOM. Для выгрузки списка всех сайтов в .csv-файл достаточно исполнить следующий скрипт:
$site = Get-SPSite -Identity http://spserver
$site.AllWebs.WebsInfo | Export-Csv -Path c:\sp\webs.csv