SharePoint. Получение списка сайтов

В SharePoint 2016 был расширен набор свойств класса SPWebInfo, что позволяет получать иерархию сайтов.

Без SPWebInfo

Без использования SPWebInfo получить список всех сайтов для коллекции сайтов можно вот так:

  1. using (var site = new SPSite(siteUrl))
  2. {
  3.     var webs = site
  4.         .AllWebs
  5.         .ToList();
  6.     foreach(var web in webs)
  7.     {
  8.         //TODO: processing the web
  9.         web.Dispose(); // Dispose
  10.     }
  11. }

Неудобство заключается в том, что SPWeb реализует интерфейс IDisposable и необходимо вызывать его метод Dispose. К тому же большинство свойств будут выбираться из базы при чтении их. Приведенный код выше порождает вызов всего двух хранимых процедур:

Но стоит добавить вывод свойства ParentWebId:

  1. foreach(var web in webs)
  2. {
  3.     //TODO: processing the web
  4.     Console.WriteLine(web.ParentWebId.ToString("B"));
  5. }

И кол-во вызовов увеличится пропорционально количеству сайтов:

SPWebInfo

Чтобы этого избежать и минимизировать нагрузку на систему получить список всех сайтов в коллекции сайтов необходимо использовать свойство SPWebCollection.WebsInfo:

  1. using (var site = new SPSite(siteUrl))
  2. {
  3.     var webs = site
  4.         .AllWebs
  5.         .WebsInfo //SPWebInfo
  6.         .ToList();
  7.     foreach(var web in webs)
  8.     {
  9.         //TODO: processing the web
  10.     }
  11. }

В SharePoint 2013 кол-во свойств было недостаточным. Нельзя было получить ни идентификатор родительского сайта, ни идентификатор коллекции сайтов. Иерархию приходилось выстраивать почти интуитивно (по URL-адресам).

SPWebInfo

Теперь же в SharePoint 2016 можно с легкостью получить список дочерних сайтов:

  1. using (var site = new SPSite(siteUrl))
  2. {
  3.     // ID родительского сайта
  4.     var parentId = new Guid("{1e71a3ea-9981-4e17-b6a2-ac6586981d02}");
  5.     var webs = site
  6.         .AllWebs
  7.         .WebsInfo // SPWebInfo
  8.         .ToList()
  9.         .Where(x => x.ParentWebId == parentId) // Фильтрация
  10.         .OrderBy(x => x.Title); // Сортировка
  11.     foreach(var web in webs)
  12.     {
  13.         //TODO: processing the web
  14.     }
  15. }

JSOM и REST

В JSOM и в REST API SharePoint 2016 Release Candidate набор свойств объекта SP.WebInformation, соответствующих SPWebInfo, не изменился.

SP.WebInformation:

SP.WebInformation sp.js

REST. Запрос по адресу вида /_api/web/webinfos:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <feed>
  3.   <id>b226f1fc-6bd4-4006-b71a-417b437d56bf</id>
  4.   <title />
  5.   <updated>2016-02-07T21:50:35Z</updated>
  6.   <entry>
  7.     <id>http://spserver/_api/SP.WebInformation2c59d10c-0c53-4a34-bbe6-7198af1e821e</id>
  8.     <category term="SP.WebInformation" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />
  9.     <link rel="edit" href="SP.WebInformation2c59d10c-0c53-4a34-bbe6-7198af1e821e" />
  10.     <title />
  11.     <updated>2016-02-07T21:50:35Z</updated>
  12.     <author>
  13.       <name />
  14.     </author>
  15.     <content type="application/xml">
  16.       <m:properties>
  17.         <d:Configuration m:type="Edm.Int16">0</d:Configuration>
  18.         <d:Created m:type="Edm.DateTime">2016-02-05T20:41:55Z</d:Created>
  19.         <d:Description></d:Description>
  20.         <d:Id m:type="Edm.Guid">1e71a3ea-9981-4e17-b6a2-ac6586981d02</d:Id>
  21.         <d:Language m:type="Edm.Int32">1033</d:Language>
  22.         <d:LastItemModifiedDate m:type="Edm.DateTime">2016-02-05T20:42:05Z</d:LastItemModifiedDate>
  23.         <d:ServerRelativeUrl>/Departments</d:ServerRelativeUrl>
  24.         <d:Title>Departments</d:Title>
  25.         <d:WebTemplate>STS</d:WebTemplate>
  26.         <d:WebTemplateId m:type="Edm.Int32">0</d:WebTemplateId>
  27.       </m:properties>
  28.     </content>
  29.   </entry>
  30. </feed>

К релизу может быть эта ситуация будет исправлена.

PowerShell

В PowerShell ситуация аналогична SSOM. Для выгрузки списка всех сайтов в .csv-файл достаточно исполнить следующий скрипт:

  1. $site = Get-SPSite -Identity http://spserver
  2. $site.AllWebs.WebsInfo | Export-Csv -Path c:\sp\webs.csv


Поделиться

Коментарии