如何将MS Graph API调用转换为GraphServiceClient方法调用
查询其他用户日历的GraphServiceClient写法
实现代码
你要调用的REST接口对应Microsoft Graph v5 SDK(当前项目通过Microsoft.Identity.Web集成的默认版本)的写法如下,直接替换原代码中的????部分即可:
// 替换为目标日历所属用户的SMTP地址或Azure AD用户ID string targetCalendarUser = "<替换为目标用户的calendarSMTP值>"; var startDateTime = new DateTimeOffset(2022, 7, 5, 0, 0, 0, TimeSpan.Zero); var endDateTime = new DateTimeOffset(2022, 7, 5, 23, 59, 0, TimeSpan.Zero); var cal = await _graphServiceClient.Users[targetCalendarUser] .CalendarView .GetAsync(config => { config.QueryParameters.StartDateTime = startDateTime.ToString("o"); config.QueryParameters.EndDateTime = endDateTime.ToString("o"); config.QueryParameters.Select = new[] { "start", "end", "subject" }; // 可选:指定返回事件的时区,避免时间转换问题 config.Headers.Add("Prefer", "outlook.timezone=\"China Standard Time\""); });
必要配置修正
当前启动代码缺少Graph客户端的注册逻辑,需要在服务注册链中补充AddMicrosoftGraph,否则注入的GraphServiceClient不会自动携带用户凭据获取访问令牌,修正后的启动配置:
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApi(builder.Configuration.GetSection("AzureAd")) .EnableTokenAcquisitionToCallDownstreamApi() // 补充这行注册Graph客户端 .AddMicrosoftGraph("https://graph.microsoft.com/v1.0", new[] { "Calendars.ReadWrite" }) .AddInMemoryTokenCaches(); var app = builder.Build();
注意事项
- 调用
CalendarView接口时,传入的时间参数建议使用ISO 8601格式(代码中ToString("o")就是输出该格式),避免接口解析时间出错 - 如果调用返回403权限不足,需要确认两个点:
- Azure AD应用注册中已经添加
Calendars.ReadWrite委托权限,且如果是访问组织内所有用户日历,需要完成管理员同意 - 如果是用户个人共享日历的场景,确认当前登录账号已经被授予目标用户日历的对应访问权限
- Azure AD应用注册中已经添加
CalendarView会自动展开周期性会议的单次实例,返回指定时间范围内实际发生的所有日程,比直接查询Events接口更适配时间段日程查询的场景
内容的提问来源于stack exchange,提问作者bmoolman
相关产品推荐
相关产品推荐

