microsoft-graph-api - C# graph SDK - 序列化批量请求的结果

标签 microsoft-graph-api microsoft-graph-sdks

我正在构建一个从 AAD 中的多个用户获取日历信息的程序。
我想尽可能高效地执行此操作,因此我开始研究 Microsoft 图形批处理功能。
我能够成功执行批处理查询,但在序列化结果时遇到问题:

//1. construct a Batch request 
var batchRequestContent = new BatchRequestContent();
var step = 1;
foreach (var userEmail in userEmails)
{
    var requestUrl = graphServiceClient
        .Users[userEmail]
        .Calendar.Events
        .Request(new List<QueryOption>
        {
            new QueryOption("startDateTime", start.ToString("o")),
            new QueryOption("endDateTime", end.ToString("o"))
        });

    var request = new HttpRequestMessage(HttpMethod.Get, requestUrl.RequestUrl);
    var requestStep = new BatchRequestStep(step.ToString(), request);
    batchRequestContent.AddBatchRequestStep(requestStep);
    step++;
}


//2. Submit request
var batchRequest = new HttpRequestMessage(HttpMethod.Post, "https://graph.microsoft.com/v1.0/$batch")
{
    Content = batchRequestContent
};
await graphServiceClient.AuthenticationProvider.AuthenticateRequestAsync(batchRequest);
var httpClient = new HttpClient();
var batchResponse = await httpClient.SendAsync(batchRequest);
//3. Process response
var batchResponseContent = new BatchResponseContent(batchResponse);
var responses = await batchResponseContent.GetResponsesAsync();
var responseHandler = new ResponseHandler(graphServiceClient.HttpProvider.Serializer);
foreach (var response in responses)
{
    if (response.Value.IsSuccessStatusCode)
    {

        var responsestring = await response.Value.Content.ReadAsStringAsync();

        var responseEvent = //?
    }
}

最重要的是,我如何将此结果序列化为强类型的事件列表?

编辑
我尝试使用 ResponseHandler 反序列化,如下所示:
var batchResponseContent = new BatchResponseContent(batchResponse);
        var responses = await batchResponseContent.GetResponsesAsync();
        var responseHandler = new ResponseHandler(new Serializer());
        foreach (var response in responses)
        {
            if (response.Value.IsSuccessStatusCode)
            {
                var events = responseHandler.HandleResponse<ICalendarEventsCollectionPage>(response.Value);
                //...
            }
        }

但这会出错并引发以下异常:
 Newtonsoft.Json.JsonSerializationException: Cannot populate JSON object onto type 'Microsoft.Graph.CalendarEventsCollectionPage'. Path '['@odata.context']', line 2, position 19.

@odata.context 似乎是导致错误的原因,请参阅下图了解我从上述请求中获得的实际响应:

enter image description here

最佳答案

您可以将标准响应处理与 ResponseHandler 类一起使用

            var batchResponseContent = new BatchResponseContent(batchResponse);
            var responses = await batchResponseContent.GetResponsesAsync();
            var responseHandler = new ResponseHandler(new Serializer());
            foreach (var response in responses)
            {
                if (response.Value.IsSuccessStatusCode)
                {
                    var events = responseHandler.HandleResponse<ICalendarEventsCollectionPage>(response.Value);
                    //...
                }
            }


并且有一种更简单的方法来创建原始请求......
var request = graphServiceClient
        .Users[userEmail]
        .Calendar.Events
        .Request(new List<QueryOption>
        {
            new QueryOption("startDateTime", start.ToString("o")),
            new QueryOption("endDateTime", end.ToString("o"))
        }).GetHttpRequestMessage();

关于microsoft-graph-api - C# graph SDK - 序列化批量请求的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57571047/

相关文章:

azure - [从 Azure AD Graph 迁移到 Microsoft Graph] : how to get the parameters to use the Microsoft Graph API

java - 使用 Java Microsoft graph SDK 在 Outlook 中添加成员

microsoft-graph-api - 使用 Graph 创建私有(private) channel 后,需要几分钟才能使用选项卡端点

microsoft-graph-api - 同步邮箱状态、增量与订阅的最佳实践

Azure AD 应用程序预先同意不起作用

c# - 如何使用 MS GRAPH SDK C# 获取驱动器信息(ParentReference) 将文件复制到另一个驱动器

c# - 无法通过 Microsoft.Graph 访问已删除项目

android - 多作用域不起作用,请使用 Microsoft Graph API SDK

azure - 无法使用图形 API 在管理单元内创建新组

outlook - 如何获取引用附件的url?