【问题标题】:Microsoft Graph SDK Request Next Link of the Batch ResponseMicrosoft Graph SDK 请求批处理响应的下一个链接
【发布时间】:2020-08-06 21:58:18
【问题描述】:

我正在使用 Microsoft Graph SDK 创建一个批处理请求,其中包含请求 20 个不同用户的单个请求。当我调用 GetNextLinkAsync() 时,结果始终为空。我尝试使用包含 20 个单独请​​求的批处理请求来请求 1000 个不同的用户。这很好用,响应总是在单个批处理响应中返回。

  1. 我不明白为什么响应以单批响应内容返回,而不是给我链接以获取下一个响应?
  2. 即使下一个链接始终为空,我如何使用 Graph SDK 跟踪它?它是一个字符串。这不像下一页请求。
foreach (var batchRequest in batchRequests)
            {
                try
                {
                    var responses = await PostBatchRequest(batchRequest.Request);
                    foreach (var id in batchRequest.RequestIds)
                    {
                        try
                        {
                            var user = await responses.GetResponseByIdAsync<User>(id);
                            users.Add(user.UserPrincipalName, user.Id);

                        } catch (ServiceException e)
                        {
                            logger.LogInformation(e.StatusCode);
                        }
                    }
                } catch (ServiceException e)
                {
                    logger.LogInformation(e.StatusCode);
                }
            }

我找不到合适的文档来告诉您如何使用 Graph SDK 跟踪下一个链接,或者为什么此类请求始终为空,或者是否有任何特殊类型的请求返回下一个链接?

【问题讨论】:

    标签: c# .net microsoft-graph-api microsoft-graph-sdks microsoft-graph-batch


    【解决方案1】:

    所以其中很多是我的包装类中的框架内容,但解决问题的关键应该在这里:

    var results = await batch.ParseAsync<ContactFolderContactsCollectionResponse, IContactFolderContactsCollectionPage>(response => {
        var page = response.Value;
        if (response?.AdditionalData != null && response.AdditionalData.ContainsKey("@odata.nextLink"))
        {
            page.InitializeNextPageRequest(Application.GraphConnection.Client, (string)response.AdditionalData["@odata.nextLink"]);
        }
        return page;
    });
    

    在这个 sn-p 中,我从批处理中解析出一个 ContactFolderContactsCollectionResponse,其中的步骤是从通常返回 IContactFolderContactsCollectionPage 的获取请求中生成的。 ContactFolderContactsCollectionResponse 由包装器内部使用

    获取
    GetResponseByIdAsync<ContactFolderContactsCollectionResponse>(id)
    

    所以它与您正在做的事情非常相似,只是您可能应该使用某种 UserResponse 类型而不是 User。

    在我的情况下,ContactFolderContactsCollectionResponse 包含 IContactFolderContactsCollectionPage 我实际想要的 Vvalue 属性,因此:

    var page = response.Value;
    

    现在,IContactFolderContactsCollectionPage 通常有一个 NextPageRequest 属性,但是当你直接从 ContactFolderContactsCollectionResponse 解析它时,它并没有填写。幸运的是,我们可以在 ContactFolderContactsCollectionResponse 的 AdditionalData 字典中找到原始的 @odata.nextPage 链接,我们可以使用 IContactFolderContactsCollectionPage.InitializeNextPageRequest 方法来设置它。 因此:

    if (response?.AdditionalData != null && response.AdditionalData.ContainsKey("@odata.nextLink"))
    {
        page.InitializeNextPageRequest(Application.GraphConnection.Client, (string)response.AdditionalData["@odata.nextLink"]);
    }
    

    希望这能给你足够的线索。抱歉,如果其余的语法令人困惑,正如我所说,其中很多都在我正在构建的包装器框架中运行,我 没有时间构建和测试干净的解决方案。

    也有可能整个事情是不同的,因为你有一个包含一千个步骤的批处理,而不是一个步骤返回数千个对象的批处理,就像我的情况一样。

    不管怎样,狩猎愉快。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-21
      • 1970-01-01
      • 1970-01-01
      • 2018-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多