1

我正在尝试使用 SharePoint 客户端框架执行搜索,使用 Windows 应用程序中的可移植 dll。

使用 Fiddler 我可以看到我的搜索已执行,并返回元数据和搜索结果的 JSON 集合。这与非便携式 CSOM 的结果相同。

当 CSOM 尝试将结果映射到它的数据对象时,我得到以下异常:

无法将“System.Collections.Generic.Dictionary`2[System.String,System.Object]”类型的对象转换为“Microsoft.SharePoint.Client.Search.Query.ResultTableCollection”。

此异常发生在 CSOM(便携式)内部。非便携式 CSOM 无异常运行,并返回预期结果。

我正在运行以获取此异常的代码是:

var query = new KeywordQuery(ctx);
query.QueryText = "something";
var executor = new SearchExecutor(ctx);
var results = executor.ExecuteQuery(query);
await ctx.ExecuteQueryAsync();

上面的 ctx 是一个已经过认证的 ClientContext。其他请求(例如获取特定列表)按预期工作。

我从 c:\Program Files\Common Files\microsoft shared\Web Server Extensions\16\ISAPI 引用以下 dll:

  • Microsoft.SharePoint.Client.Portable.dll
  • Microsoft.SharePoint.Client.Runtime.Portable.dll
  • Microsoft.SharePoint.Client.Runtime.WindowsStore.dll
  • Microsoft.SharePoint.Client.Search.Portable.dll

我的问题是。

如何解决此问题,以便我可以使用 CSOM 从 Windows 应用商店应用程序运行搜索查询?

更新:我在验证 ClientContext 后添加了以下内容:

ctx.ExecutingWebRequest += (s, e) =>
    e.WebRequest.Headers["Accept-Encoding"] = "gzip, deflate";

这解决了眼前的问题,但引入了一个新问题。我现在得到一个 System.FormatException:

格式不正确的 JSON 流。

由于来自可移植和非可移植 CSOM 的 JSON 是相同的,因此一个 CSOM 而不是另一个 CSOM 中不应出现解析错误。

4

2 回答 2

0

我可以从您的异常中确定的是,执行查询结果的转换在这里会产生问题。

使用下面的代码来转换执行查询结果

ResultTable rtSharePointSearchResult = new ResultTable();
KeywordQuery query = new KeywordQuery(clientContext);
query.QueryText = "Keywords";
query.TrimDuplicates = false;
SearchExecutor searchExecutor = new SearchExecutor(clientContext);
ClientResult<ResultTableCollection> results = searchExecutor.ExecuteQuery(query);
clientContext.ExecuteQuery();
rtSharePointSearchResult = results.Value[0];
于 2015-07-10T11:07:27.130 回答
0

请注意,第一篇文章使用 ctx.ExecuteQueryAsync,但“答案”使用 ctx.ExecuteQuery。

该错误存在于可移植类库(第一篇文章使用)中,但这适用于非便携版本(第二篇文章)。

干杯,保罗

于 2017-03-29T09:28:51.767 回答