并非所有网站集都显示在结果中 - SharePoint 2013 通过 CSOM 搜索
本文关键字:SharePoint 2013 通过 搜索 CSOM 结果 网站 显示 | 更新日期: 2023-09-27 18:30:21
我正在处理一个 C# 代码,该代码从本地 SharePoint 2013 服务器检索所有网站集路径。服务器上有以下网站集:
/服务器网址/
/serverurl/my
/serverurl/my/personal/site1
/serverurl/my/personal/site2
/serverurl/sites/testsite
/serverurl/custompath/site3
当我运行我的代码时,我只得到以下网站集:
/服务器网址/
/serverurl/my
/serverurl/my/personal/site1
/serverurl/my/personal/site2
我想知道为什么我的搜索没有返回所有网站集?
这是我的代码:
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);
}
谢谢!
我今天遇到了同样的问题。我找到了两个解决方案。
无论你是在本地还是在Office365上,我们都可以使用Microsoft.Online.SharePoint.Client.Tenant dll。 您可以使用它来获取所有网站集。 如果你在本地,你确实需要你的管理员运行一些电源外壳。 Vesa 很好,可以在这里写一篇关于它的博客
完成此操作后,您可以执行以下操作(注意:I尚未使用非管理员帐户测试此方法)(解决方案从此处获取) 可悲的是,这对我来说不起作用,因为我想要安全修整,这将代码必须由具有租户读取权限的用户运行,而我们的用户通常不会拥有。
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
设置为 false,我不知道为什么 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();
希望两者之一对您有用。