并非所有网站集都显示在结果中 - Sharepoint 2013通过CSOM搜索

时间:2016-01-14 04:06:50

标签: c# sharepoint csom

我正在开发一个C#代码,用于从On-Premise Sharepoint 2013服务器检索所有网站集路径。我在服务器上有以下网站集:

/ SERVERURL /
/ SERVERURL /我
/ SERVERURL /我/个人/ site1的
/ SERVERURL /我/个人/站点2
/ SERVERURL /网站/测试网站
/ SERVERURL / custompath / site3

当我运行我的代码时,我只获得以下网站集:
/ SERVERURL /
/ SERVERURL /我
/ SERVERURL /我/个人/ site1的
/ SERVERURL /我/个人/站点2
我想知道为什么我的搜索没有返回所有的网站集? 这是我的代码:

ClientContext context = new ClientContext(siteUrl);
var cred = new NetworkCredential(userName, password, domain);
context.Credentials = cred;
KeywordQuery query = new KeywordQuery(context);
query.QueryText = "contentclass:STS_Site";
SearchExecutor executor = new SearchExecutor(context);
query.TrimDuplicates = true;
var resultTable = executor.ExecuteQuery(query);
context.ExecuteQuery();
foreach (var row in resultTable.Value[0].ResultRows)
{
   string siteName = row["siteName"] as string;
   Console.WriteLine("Site Name: {0}", siteName);
}

谢谢!

1 个答案:

答案 0 :(得分:1)

我今天遇到了同样的问题。我找到了两个解决方案。

无论您是在本地还是在Office365上,我们都可以使用Microsoft.Online.SharePoint.Client.Tenant dll。您可以使用它来获取所有网站集。如果你在本地,你需要你的管理员运行一些电源shell。 Vesa很乐意写一篇关于它的博客here

完成后,您可以执行以下操作(注意:我没有使用非管理员帐户测试此方法)(解决方案取自here)遗憾的是,这个方法对我不起作用我想要安全修整,这将代码必须由具有租户读取权限的用户运行,我们的用户通常不会这样做。

var tenant = new Tenant(clientContext);
SPOSitePropertiesEnumerable spp = tenant.GetSiteProperties(0, true);
clientContext.Load(spp);
clientContext.ExecuteQuery();
foreach(SiteProperties sp in spp)
{
    // you'll get your site collections here
}

我最终做了这个回到使用搜索,我仍有问题,我们有超过500个网站/网站,所以我和我们的管理员一起工作,看看我们是否可以增加最大行搜索能返回。但是,这里真正的秘密是TrimDuplicates设置为假,我不知道为什么SP认为结果是重复的,但显然这样做,所以将其设置为false你应该看到你所有的坐姿。

KeywordQuery query = new KeywordQuery(ctx);
query.QueryText = "contentclass:\"STS_Site\"";
query.RowLimit = 500;//max row limit is 500 for KeywordQuery
query.EnableStemming = true;
query.TrimDuplicates = false;
SearchExecutor searchExecutor = new SearchExecutor(ctx);
ClientResult<ResultTableCollection> results = searchExecutor.ExecuteQuery(query);
ctx.ExecuteQuery();
var data = results.Value.SelectMany(rs => rs.ResultRows.Select(r => r["Path"])).ToList();

希望其中一个能为你效劳。