Есть ли способ проверить идентификатор сайта без создания экземпляра SPSite?
Вопрос
Мне нужен быстрый способ убедиться в правильности идентификатора сайта.Создание экземпляра SPSite кажется довольно дорогостоящим, поэтому, возможно, есть другие варианты сделать это.
Решение
Предполагая, что где-то в объектной модели SharePoint нет метода, который делал бы это каким-то сверхэффективным способом (да, я тоже не смог его найти), я провел некоторое тестирование, которое, кажется, предполагает, что лучше всего для доступа к соответствующему объекту SPWebApplication и перечислению свойства Sites этого объекта.
Я создал набор для быстрого тестирования в виде страницы приложения с тремя кнопками:
После нажатия каждая кнопка проверяет один или несколько идентификаторов сайтов, используя три разных метода, каждый из которых заключен в экземпляр SPMonitoredScope:
Создание экземпляра SPSite
try { using (SPSite site = new SPSite(siteId)) {} } catch {}
Использование текущего SPContext для доступа к свойству Sites веб-приложения (итерация с помощью foreach)
var sites = SPContext.Current.Site.WebApplication.Sites; foreach (SPSite site in sites) { if (site.ID == siteId) { // site found break; } }
Использование текущего SPContext для доступа к свойству Sites веб-приложения (LINQ)
var site = SPContext.Current.Site.WebApplication.Sites.FirstOrDefault(x => x.ID == siteId); if (site != null) { // site found }
Очевидно, что последние два тестовых примера полезны только в том случае, если вы можете получить доступ к действительному SPContext
объект.В вопросе не уточняется, где находится ваш код (задание таймера, приемник событий, веб-часть, веб-сервис и т. д.), поэтому я только предполагаю, что вы может доступ к действительному SPContext
.Еще одно очевидное замечание, на которое следует обратить внимание:это во многом зависит от топологии вашей фермы, в частности от количества задействованных семейств сайтов.
Полученные результаты
Пример вывода панели разработчика:
Следующие цифры являются средними значениями, основанными на 5 кликах на кнопку:
- Тестирование с текущим идентификатором сайта
- Создание экземпляра SPSite...(0,09 мс)
- Использование SPContext для доступа к свойству Sites веб-приложения (foreach)...(2,85 мс)
- Использование SPContext для доступа к свойству Sites веб-приложения (LINQ)...(2,28 мс)
- Тест с ошибочным идентификатором сайта
- Создание экземпляра SPSite...(2,42 мс) (что интересно, намного выше благодаря исключению)
- Использование SPContext для доступа к свойству Sites веб-приложения (foreach)...(2,33 мс)
- Использование SPContext для доступа к свойству Sites веб-приложения (LINQ)...(2,17 мс)
- Тест со 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 г.) ЯММВ