SPSite.Exists(url) возвращает false, хотя URL существует
Кто-нибудь знает почему SPSite.Exists(url)
вернуть false, хотя URL существует.
Если я проверяю приведенное выше утверждение, оно возвращает false.
Но я могу открыть сайт без проблем, если я использую напрямую
SPSite myRootSite = new SPSite(url);
Вот моя кодировка.
if (SPSite.Exists(new Uri(url)))
{
SPSite myRootSite = new SPSite(url);
}
ОБНОВИТЬ:
Извините, я звонил в SharePoint с одного из моих бизнес-уровней, что запрещено.
Моя вина!!
3 ответа
Метод SPSite.Exists
проверяет, существует ли семейство сайтов по указанному URL. Но возвращается false
если URL указывает на вложенную сеть семейства сайтов.
Учитывая следующую структуру:
http: // server -> семейство сайтов http://server/web -> sub web http://server/sites/somesite -> семейство сайтов
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
Если вы хотите проверить, есть ли какая-либо сеть по указанному 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: // сервер / это / не существует / не существует, то самое верхнее семейство сайтов на http: // сервер будет удалено.
Ответ от Стефана почти правильный. Вот полный код, который должен правильно определить, существует ли 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;
}
}
На самом деле метод 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;
}