【问题标题】:Microsoft Graph SDK C# Newtonsoft.Json: Error reading JObject from JsonReaderMicrosoft Graph SDK C# Newtonsoft.Json:从 JsonReader 读取 JObject 时出错
【发布时间】:2021-07-02 13:05:29
【问题描述】:

我想获取组的直接用户成员资格的计数。 这可以通过Advanced Queries 实现。我正在使用 Microsoft Graph SDK 和此代码来请求它:

var url = client
  .Groups[groupId]
  .Members
  .AppendSegmentToRequestUrl("microsoft.graph.user/$count");

var requestbuilder = new GroupRequestBuilder(url, client);

var result = await requestbuilder
  .Request()
  .Header("ConsistencyLevel", "eventual")
  .GetAsync();

应该相当于这个网址:

https://graph.microsoft.com/v1.0/groups/<groupId>/members/microsoft.graph.user/$count

带有标题:

ConsistencyLevel = eventual

请求似乎正常,但响应仅包含纯文本计数。这就是我认为 JsonReader 抛出错误的原因。 那么如何才能只得到这个纯文本结果值呢?

我尝试将 select 添加到查询中以跳过 JsonReader,但 lambda 只接受组属性...

await requestbuilder
  .Request()
  .Header("ConsistencyLevel", "eventual")
  .Select(x => new { x })
  .GetAsync();

【问题讨论】:

  • 我在Graph Explorer 中运行了该查询,它返回文本/纯文本,而不是应用程序/json。所以,不要尝试用 JSON.NET 反序列化它,只需将其读取为字符串
  • @Crowcoder 我已经在我的问题中描述了这一点。问题是如何指示 C# SDK 不反序列化响应?

标签: c# azure-active-directory microsoft-graph-api microsoft-graph-sdks


【解决方案1】:

我通过查看 Microsoft.Graph.Core 源代码和文档找到了答案。 在我的情况下,响应消息总是反序列化导致问题的原因。

我为文本/纯文本响应消息创建了一个自定义 IResponseHandler

    public class GraphPlainTextResponseHandler : IResponseHandler
    {
        public async Task<T> HandleResponse<T>(HttpResponseMessage response)
        {
            //Throw error if reponse is not successful
            if (!response.IsSuccessStatusCode) throw new HttpResponseException(response.StatusCode);
            //Throw error if response content-type is not of type text/plain
            if (response.Content.Headers.ContentType.MediaType != "text/plain") throw new InvalidOperationException($"Incorrect Content-Type: {response.Content.Headers.ContentType.MediaType}");

            return (T)Convert.ChangeType(await response.Content.ReadAsStringAsync(), typeof(T));

        }
    }

然后我用这段代码创建了请求:

var url = client.Groups[groupId].Members.AppendSegmentToRequestUrl("microsoft.graph.user/$count");
            var baseRequest = new BaseRequest(url, client).WithResponseHandler(new GraphPlainTextResponseHandler());
            baseRequest.Header("ConsistencyLevel", "eventual");
            
            var result = await baseRequest.SendAsync<string>(null, CancellationToken.None);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-13
    • 2019-11-13
    • 1970-01-01
    • 2022-11-27
    相关资源
    最近更新 更多