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

kev*_*vin 6 c# sharepoint spsite

SPSite.Exists(url)虽然网址存在,但有人知道为什么返回false.

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

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

SPSite myRootSite = new SPSite(url);
Run Code Online (Sandbox Code Playgroud)

这是我的编码.

if (SPSite.Exists(new Uri(url)))
{
     SPSite myRootSite = new SPSite(url);
}
Run Code Online (Sandbox Code Playgroud)

更新:

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

我的错 !!

Ste*_*fan 15

该方法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
Run Code Online (Sandbox Code Playgroud)

如果要检查给定URL是否有任何Web,则必须使用该方法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;
  }
}
Run Code Online (Sandbox Code Playgroud)

SPSite构造函数接受指向网站集的一个子元素的任何URL.即使给定位置没有元素.

new SPSite("http://server/this/does/not/exist");
Run Code Online (Sandbox Code Playgroud)

此剪切将返回位于http:// server的网站集.

虽然这在大多数情况下非常有用,但在某些情况下这是危险的.请考虑以下方法:

public static void DeleteSite(string url)
{
  new SPSite(url).Delete();
}
Run Code Online (Sandbox Code Playgroud)

如果使用http:// server/this/does/not/exists调用此方法,则将删除http:// server上的最顶层网站集.

  • 我刚刚发现您的解决方案可能会带来误报。在用于SPWeb的最内部使用中,应返回web.Exists,而不是返回true,至少对于SP 2013,在不存在Web的情况下不会出现错误。 (2认同)

Mak*_*yeu 1

实际上,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;
}
Run Code Online (Sandbox Code Playgroud)