有人知道为什么 SPSite.Exists(url)
会返回false,尽管网址存在。
如果我检查上述语句,则返回false。
但如果我直接使用
,我可以毫无问题地打开网站SPSite myRootSite = new SPSite(url);
这是我的编码。
if (SPSite.Exists(new Uri(url)))
{
SPSite myRootSite = new SPSite(url);
}
更新:
抱歉,我是从我的某个业务层调用SharePoint的,这是不允许的。
我的错!
答案 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;
}