c# - Microsoft Graph SDK 请求批量响应的下一个链接

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

我正在使用 Microsoft Graph SDK 创建一个批量请求,其中包含请求 20 个不同用户的单独请求。当我调用 GetNextLinkAsync() 时,结果始终为 null。我尝试使用批量请求来请求 1000 个不同的用户,每个请求包含 20 个单独的请求。这工作正常,响应始终在单个批响应中返回。

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

最佳答案

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

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。 ContactFolderContactsCollectionResponse 由包装器内部使用

获取
GetResponseByIdAsync<ContactFolderContactsCollectionResponse>(id)

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

就我而言,ContactFolderContactsCollectionResponse 包含我在 Vvalue 属性中实际想要的 IContactFolderContactsCollectionPage,因此:

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

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

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

无论怎样,狩猎愉快。

关于c# - Microsoft Graph SDK 请求批量响应的下一个链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63292329/

相关文章:

c# - 显示 ListView 中项目的上下文菜单

c# - 从 TableView 打开 View

.net - System.Net.WebClient 请求得到 403 Forbidden 但浏览器没有使用 Apache 服务器

来自不同租户的 Azure AD 同意书

microsoft-graph-api - 同步新日历事件始终具有 @removed 字段

c# - 微软图: Invalid batch payload format

c# - 如何通过c#代码查找网络上UPNP设备的IP地址(DHCP)

c# - EqualityComparer<T>.Default 误解?

c# - 如何知道网络接口(interface)何时在 C# 中使用路由器作为 DNS 服务器?

c# - 我们可以为文件上传控制浏览按钮设置默认位置吗