虽然url存在,但SPSite.Exists(url)返回false

时间:2011-12-09 07:08:51

标签: c# sharepoint spsite

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

如果我检查上述语句,则返回false。

但如果我直接使用

,我可以毫无问题地打开网站
SPSite myRootSite = new SPSite(url);

这是我的编码。

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

更新:

抱歉,我是从我的某个业务层调用SharePoint的,这是不允许的。

我的错!

3 个答案:

答案 0 :(得分:14)

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

鉴于以下结构:

  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

如果您想检查给定网址是否有任何网页,您必须使用方法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 / exists 调用此方法,将删除 http:// server 中最顶级的网站集。

答案 1 :(得分: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;
    }
}

答案 2 :(得分: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;
}