Есть ли способ проверить идентификатор сайта без создания экземпляра SPSite?

sharepoint.stackexchange https://sharepoint.stackexchange.com//questions/54241

  •  10-12-2019
  •  | 
  •  

Вопрос

Мне нужен быстрый способ убедиться в правильности идентификатора сайта.Создание экземпляра SPSite кажется довольно дорогостоящим, поэтому, возможно, есть другие варианты сделать это.

Это было полезно?

Решение

Предполагая, что где-то в объектной модели SharePoint нет метода, который делал бы это каким-то сверхэффективным способом (да, я тоже не смог его найти), я провел некоторое тестирование, которое, кажется, предполагает, что лучше всего для доступа к соответствующему объекту SPWebApplication и перечислению свойства Sites этого объекта.

Я создал набор для быстрого тестирования в виде страницы приложения с тремя кнопками:

enter image description here

После нажатия каждая кнопка проверяет один или несколько идентификаторов сайтов, используя три разных метода, каждый из которых заключен в экземпляр SPMonitoredScope:

  1. Создание экземпляра SPSite

    try
    {
       using (SPSite site = new SPSite(siteId)) {}
    }
    catch {}
    
  2. Использование текущего SPContext для доступа к свойству Sites веб-приложения (итерация с помощью foreach)

    var sites = SPContext.Current.Site.WebApplication.Sites;
    foreach (SPSite site in sites)
    {
       if (site.ID == siteId)
       {
          // site found
          break;
       }
    }
    
  3. Использование текущего SPContext для доступа к свойству Sites веб-приложения (LINQ)

    var site = SPContext.Current.Site.WebApplication.Sites.FirstOrDefault(x => x.ID == siteId);
    if (site != null)
    {
       // site found
    }
    

Очевидно, что последние два тестовых примера полезны только в том случае, если вы можете получить доступ к действительному SPContext объект.В вопросе не уточняется, где находится ваш код (задание таймера, приемник событий, веб-часть, веб-сервис и т. д.), поэтому я только предполагаю, что вы может доступ к действительному SPContext.Еще одно очевидное замечание, на которое следует обратить внимание:это во многом зависит от топологии вашей фермы, в частности от количества задействованных семейств сайтов.

Полученные результаты

Пример вывода панели разработчика:

enter image description here

Следующие цифры являются средними значениями, основанными на 5 кликах на кнопку:

  1. Тестирование с текущим идентификатором сайта
    • Создание экземпляра SPSite...(0,09 мс)
    • Использование SPContext для доступа к свойству Sites веб-приложения (foreach)...(2,85 мс)
    • Использование SPContext для доступа к свойству Sites веб-приложения (LINQ)...(2,28 мс)
  2. Тест с ошибочным идентификатором сайта
    • Создание экземпляра SPSite...(2,42 мс) (что интересно, намного выше благодаря исключению)
    • Использование SPContext для доступа к свойству Sites веб-приложения (foreach)...(2,33 мс)
    • Использование SPContext для доступа к свойству Sites веб-приложения (LINQ)...(2,17 мс)
  3. Тест со 100 идентификаторами (1 — текущий идентификатор сайта).
    • Создание экземпляра SPSite...(189,08 мс)
    • Использование SPContext для доступа к свойству Sites веб-приложения (foreach)...(2,14 мс)
    • Использование SPContext для доступа к свойству Sites веб-приложения (LINQ)...(2,07 мс)

С учетом всего сказанного, я думаю, что это действительно зависит от характера вашего сравнения:со сколькими идентификаторами вы имеете дело, со сколькими семействами веб-сайтов вы имеете дело и т. д.Преимущество объекта SPContext в том, что он уже находится в памяти, независимо от того, используете вы его или нет.Если вы просматриваете коллекцию идентификаторов сайтов-кандидатов в контексте особый веб-приложение, мои 0,02 доллара составляют: возьмите соответствующий объект SPWebApplication и используйте краткий запрос LINQ для проверки каждого идентификатора.:

var site = SPContext.Current.Site.WebApplication.Sites.FirstOrDefault(x => siteIds.Contains(x.ID));
if (site != null)
{
   // site found
}

Отказ от ответственности:Эти тесты проводились на ферме разработки с тремя веб-приложениями и только тремя семействами веб-сайтов (по одному на каждое веб-приложение).Windows Server 2008 R2, SharePoint Server 2010 (август 2011 г.) ЯММВ

Лицензировано под: CC-BY-SA с атрибуция
Не связан с sharepoint.stackexchange
scroll top