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-адресам).

SPWebInfo

SPWebInfo

Теперь же в 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:

SP.WebInformation sp.js

SP.WebInformation sp.js

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
Виталий Жуков

Виталий Жуков

SharePoint архитектор, разработчик, тренер, Microsoft MVP (Office Development). Более 15 лет опыта работы с SharePoint, Dynamics CRM, Office 365, и другими продуктами и сервисами Microsoft.

Смотрите также

SharePoint 2007. Проверка на наличие элемента в списке

SharePoint 2007. Проверка на наличие элемента в списке

SharePoint 2007. База данных содержимого

SharePoint 2007. База данных содержимого

SharePoint 2007. Свой контрол на панели свойств веб-парта

SharePoint 2007. Свой контрол на панели свойств веб-парта

SharePoint 2007. Максимальное/минимальное значение поля в списке

SharePoint 2007. Максимальное/минимальное значение поля в списке

SharePoint 2007. Получение данных из нескольких списков и узлов

SharePoint 2007. Получение данных из нескольких списков и узлов