6

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

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

但是如果我直接使用,我可以毫无问题地打开网站

SPSite myRootSite = new SPSite(url);

这是我的编码。

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

更新 :

抱歉,我从不允许的业务层之一调用 SharePoint。

我的错 !!

4

3 回答 3

15

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

给定以下结构:

  http://服务器 -> 网站集
    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

如果您想检查给定 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的最顶层网站集。

于 2011-12-09T09:14:14.107 回答
3

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;
    }
}
于 2015-01-15T11:17:38.810 回答
1

实际上,方法 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;
}
于 2011-12-09T07:38:37.710 回答