exists (url)返回false,尽管url存在

本文关键字:url 尽管 false 存在 返回 exists | 更新日期: 2023-09-27 18:17:24

有人知道为什么 SPSite.Exists(url)返回false,尽管url存在

如果检查上面的语句,它返回false。

但是如果我直接使用

就可以打开网站,没有任何问题
SPSite myRootSite = new SPSite(url);

这是我的代码。

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

更新:

对不起,我正在从我的业务层调用SharePoint,这是不允许的。

我的错!!

exists (url)返回false,尽管url存在

方法SPSite.Exists检查指定URL上的站点集是否存在。但返回false,如果URL指向一个网站集合的子网站。

给定以下结构:

<>之前http://server ->网站收集http://server/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

如果你想检查是否有任何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最顶端的站点集合将被删除。

Stefan的回答基本正确。下面是完整的代码,它可以正确地判断给定URL上是否存在SPWeb:

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创建一个站点,并尝试捕获一个异常。除此之外,它执行路径比较,这对您来说可能是不必要的。因此,如果你创建自己的方法来检查网站是否存在,这将远远超过OK。

这个方法可能看起来像

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;
}