使用MS Graph API在C#中向共享日历添加事件时遇到PostAsync方法未定义的错误
使用MS Graph API在C#中向共享日历添加事件时遇到PostAsync方法未定义的错误
嘿,我来帮你解决这个问题!你遇到的PostAsync未定义错误,本质上是API调用路径不对,再加上权限、返回类型的小问题,咱们一步步来修正:
先理清几个核心问题:
- 权限不足:你当前的
scopes只设置了User.Read,但要修改共享日历,需要Calendars.ReadWrite或者更精准的Calendars.ReadWrite.Shared权限,否则不仅会有方法调用问题,后续也会触发权限报错。 - 共享日历访问路径错误:
graphClient.Me.Calendars["dummy@email.com"]是错误用法——Calendars[]括号里需要填日历的ID,不是共享用户的邮箱地址。要访问其他用户的共享日历,得通过Users端点定位对方的日历。 - 返回类型不匹配:你的
Add方法返回IUserCalendarsCollectionPage,但添加事件的操作返回的是单个Event对象,类型完全不匹配,这也会导致编译问题。
修正后的完整代码示例:
我标注了关键修改点,你可以参考调整:
// 注意:返回类型改为Task<Event>,添加事件返回的是单个事件对象 private async Task<Event> AddSharedCalendarEvent() { var requestBody = new Event { Subject = "TEST", Body = new ItemBody { ContentType = BodyType.Html, Content = "TESTING", }, Start = new DateTimeTimeZone { DateTime = "2026-03-15T12:00:00", TimeZone = "Pacific Standard Time", }, End = new DateTimeTimeZone { DateTime = "2026-03-15T14:00:00", TimeZone = "Pacific Standard Time", }, Location = new Location { DisplayName = "TESTLoc", }, }; // 关键修改1:添加正确的权限 var scopes = new[] { "Calendars.ReadWrite.Shared" }; var tenantId = "some value"; var clientId = "some value"; var options = new DeviceCodeCredentialOptions { AuthorityHost = AzureAuthorityHosts.AzurePublicCloud, ClientId = clientId, TenantId = tenantId, DeviceCodeCallback = (code, cancellation) => { Console.WriteLine(code.Message); return Task.FromResult(0); }, }; var deviceCodeCredential = new DeviceCodeCredential(options); var graphClient = new GraphServiceClient(deviceCodeCredential, scopes); // 关键修改2:正确访问共享用户的日历 // 替换成共享日历所属用户的邮箱,以及该日历的ID var sharedUserEmail = "dummy@email.com"; var sharedCalendarId = "你的共享日历ID"; // 关键修改3:使用正确路径调用PostAsync,并且加上await var result = await graphClient.Users[sharedUserEmail].Calendars[sharedCalendarId].Events.PostAsync(requestBody); return result; }
额外提示:如何获取共享日历的ID?
如果你不知道共享日历的ID,可以先调用下面的代码获取该用户的所有日历列表,找到对应的日历名称和ID:
var calendars = await graphClient.Users[sharedUserEmail].Calendars.GetAsync(); foreach (var calendar in calendars.Value) { Console.WriteLine($"日历名称:{calendar.Name},ID:{calendar.Id}"); }
这样调整后,你应该就能顺利调用PostAsync方法,把事件添加到共享日历里了!
备注:内容来源于stack exchange,提问作者user31876733
相关产品推荐
相关产品推荐

