2

我正在使用 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 跟踪下一个链接,或者为什么此类请求始终为空,或者是否有任何特殊类型的请求返回下一个链接?

4

1 回答 1

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;
});

在此代码段中,我从批处理中解析出一个 ContactFolderContactsCollectionResponse,其中包含从通常返回 IContactFolderContactsCollectionPage 的 get 请求生成的步骤。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"]);
}

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

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

不管怎样,狩猎愉快。

于 2020-12-08T04:22:21.383 回答