Есть ли встроенный метод, чтобы сказать, принадлежит ли определенный URL этому SPWeb или другому SPWeb? - PullRequest
0 голосов
/ 18 марта 2010

У меня есть список URL-адресов (URL-адреса использования типа контента). Теперь типы контента развернуты в Интернете. Мне нужно зациклить эти типы контента и выполнить некоторые действия в каждом списке, но при открытии нового экземпляра SPWeb каждый цикл слишком ресурсоемкий.

Есть ли встроенный метод, чтобы сказать мне, принадлежит ли этот URL к определенному объекту SPWeb?

Пример:

SPWeb может быть

С ссылками на использование типа контента, такими как:

  • / web2 / Страницы
  • / Web2 / списки / Задачи
  • / Web2 / списки / Документы
  • / Web2 / subweb1 / списки / Задачи
  • ...

Как видите, для первых 3-х использований мне не нужно открывать новый SPWeb

Ответы [ 3 ]

2 голосов
/ 18 марта 2010

Просто предположение, но, возможно, стоит попробовать SPWeb.GetList(serverRelativeUrl) на уже имеющихся экземплярах SPWeb и, если ни один из них не соответствует, создать новый SPWeb?

Обновление: другая идея. Предполагая, что все SPWeb находятся на одном и том же SPSite, вы также можете использовать эту конкретную перегрузку SPSite.OpenWeb() (и установить для флага requestExactUrl значение false). Это вернет вам необходимый объект SPWeb. Внутренне, открытые объекты SPWeb используются повторно (что вы можете увидеть в методе SPWeb.SPWebConstructor в Reflector), так что это не сильно повлияет на производительность. неправильно, объекты SPweb просто сохраняются в списке, не используется повторно.

1 голос
/ 18 марта 2010

В каком контексте будет работать ваш код?

Я имею в виду, похоже, что вы хотите написать некоторый код, который будет запускаться как часть процесса развертывания, а это означает, что он будет запускаться только изредка.

Если это так, имеет ли значение, оптимизирован ли ваш код для повышения производительности? На мой взгляд, было бы лучше придерживаться простого решения по открытию каждого SPWeb и не слишком беспокоиться о производительности.

Если вам нужно перебрать сотни или тысячи сайтов, это займет некоторое время. То, занимает ли ваш код десять минут или пятнадцать, не должно иметь большого значения.

Производительность была бы более серьезной проблемой, если бы она запускалась много раз и часто.

0 голосов
/ 18 марта 2010

Насколько я знаю, для такого рода вещей нет встроенного метода.
Я бы посоветовал вам создать для этого метод расширения SPWeb.

Вот фрагмент кода для начала работы (не проверено на 100%):

public static class SPWebExtensions
{
  public static bool UrlBelongsToweb(this SPWeb web, string url)
  {
    Uri uriWeb = new Uri(web.Url);

    if (uriWeb.LocalPath.ToLower() == url.ToLower())
      return true;

    if (!url.ToLower().StartsWith(uriWeb.LocalPath.ToLower()))
      return false;

    foreach (SPWeb subWeb in web.Webs)
    {
      Uri uriSub = new Uri(subWeb.Url);
      if (url.ToLower().StartsWith(uriSub.LocalPath.ToLower()))
        return false;

      subWeb.Dispose();
    }
    return true;
  }
}

Вы бы использовали это как-то так:

 bool urlBelongsToWeb = web.UrlBelongsToweb("/web2/Lists/Documents");

Где web - ваш текущий объект SPWeb.

В качестве альтернативы, если вы хотите настроить таргетинг на определенные списки в вашей коллекции SiteCollection, используйте SPSiteDataQuery , чтобы получить их и выполнить магическую работу против них.

...