SPSite.Exists (url) возвращает false, хотя URL существует - PullRequest
5 голосов
/ 09 декабря 2011

Кто-нибудь знает, почему SPSite.Exists(url) возвращает false, хотя URL существует .

Если я проверяю приведенное выше утверждение, оно возвращает false.

Но я могу без проблем открыть сайт, если напрямую использую

SPSite myRootSite = new SPSite(url);

Вот мое кодирование.

if (SPSite.Exists(new Uri(url)))
{
     SPSite myRootSite = new SPSite(url);
}

ОБНОВЛЕНИЕ:

Извините, я звонил в SharePoint с одного из моих бизнес-уровней, что запрещено.

Моя ошибка !!

Ответы [ 3 ]

14 голосов
/ 09 декабря 2011

Метод SPSite.Exists проверяет, существует ли семейство сайтов по указанному URL.Но возвращает false, если URL-адрес указывает на вложенную сеть семейства сайтов.

Учитывая следующую структуру:

  http://server                  -> site collection
    http://server/web            -> sub web
    http://server/sites/somesite -> site collection
SPSite.Exists(new Uri("http://server")) // returns true
SPSite.Exists(new Uri("http://server/web")) // returns false
SPSite.Exists(new Uri("http://server/sites/somesite")) // returns true

Если вы хотите проверить, есть лиweb по указанному URL, вы должны использовать метод SPSite.OpenWeb(string url, bool requireExactUrl):

public static bool SiteExists(string url)
{
  try
  {
      using (SPSite site = new SPSite(url))
      {
        using (SPWeb web = site.OpenWeb(url, true))
        {
          return true;
        }
      }
  }
  catch (FileNotFoundException)
  {
    return false;
  }
}

Конструктор SPSite принимает любой URL, указывающий на вложенный элемент семейства сайтов.Даже если в указанном месте нет элемента.

new SPSite("http://server/this/does/not/exist");

Этот отсканированный код вернет семейство сайтов, расположенное по адресу http://server.

Хотя в большинстве случаев это очень полезно, существуют ситуации, когдаэто опасноРассмотрим следующий метод:

public static void DeleteSite(string url)
{
  new SPSite(url).Delete();
}

Если этот метод вызывается с http://server/this/does/not/exist, то самое верхнее семейство сайтов на http://server будет удалено.

3 голосов
/ 15 января 2015

Ответ от Стефана почти правильный.Вот полный код, который должен правильно определить, существует ли SPWeb по указанному URL:

public static bool WebExists(string absoluteUrl)
{
    try
    {
        using (var site = new SPSite(absoluteUrl))
        {
            using (var web = site.OpenWeb())
            {
                return web.Exists;
            }
        }
    }
    catch (FileNotFoundException)
    {
        return false;
    }
}
1 голос
/ 09 декабря 2011

На самом деле метод SPSite.Exists пытается создать сайт из вашего URL-адреса и пытается отловить исключение. Кроме того, он выполняет сравнение путей, которые могут быть вам не нужны. Поэтому, если вы создадите свой собственный метод для проверки существования сайта, это будет намного больше, чем ОК.

этот метод может выглядеть как

public static bool SiteExists(string path){
 SPSite site;
 try{
  site = new SPSite(path);
 }
 catch(FileNotFoundException e)
 {
  return false;
 }
 finally
 {
  if(site!=null) site.Dispose();
 }
 return true;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...