我正在使用 Microsoft Graph SDK 创建一个批量请求,其中包含请求 20 个不同用户的单独请求。当我调用 GetNextLinkAsync() 时,结果始终为 null。我尝试使用批量请求来请求 1000 个不同的用户,每个请求包含 20 个单独的请求。这工作正常,响应始终在单个批响应中返回。
- 我无法理解为什么响应以单批响应内容返回,而不是为我提供获取下一个响应的链接?
- 即使下一个链接始终为空,我如何使用 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/