PAYATHON 2026

如何用 Microsoft Graph C# SDK 向共享日历添加事件?

数据小陈

结论

这个错误通常是因为调用方式与项目安装的 Microsoft Graph .NET SDK 版本不匹配。较早版本通常使用 .Request().AddAsync(...) 创建事件,较新的版本则使用 PostAsync(...)。此外,Calendars[...] 中需要传入日历 ID,不能直接使用邮箱地址。创建事件还需要日历写入权限,示例中的 User.Read 不够。

按 SDK 版本调整调用

如果项目使用较早版本的 Microsoft Graph .NET SDK,可以按该版本的请求构建器写法调用:

var createdEvent = await graphClient.Me
    .Calendars[calendarId]
    .Events
    .Request()
    .AddAsync(requestBody);

较新的 SDK 使用 PostAsync:

var createdEvent = await graphClient.Me
    .Calendars[calendarId]
    .Events
    .PostAsync(requestBody);

这两种调用方式不能混用。先查看项目实际引用的 Microsoft.Graph NuGet 包版本和 IntelliSense 提示,再选择对应的写法。原报错中出现的 IUserEventsCollectionRequestBuilder,说明当前代码使用的 API 类型没有 PostAsync 成员。如果该版本提供 .Request().AddAsync(...),就应使用这种写法。若要改用 PostAsync,需要确认项目引用的 SDK 版本支持该调用,并按该版本的类型调整代码。

使用正确的日历标识

原代码中的:

graphClient.Me.Calendars["dummy@email.com"]

方括号中应填写日历 ID,而不是邮箱地址。可以先读取当前用户可访问的日历,获取目标日历的 ID,再用它创建事件。若目标日历属于其他用户或共享邮箱,应根据实际授权方式,通过相应的用户或日历路径访问。当前用户也必须有权访问该日历。

检查权限和认证方式

创建事件需要日历写入权限。使用委托访问时,应为应用配置并取得适用的日历写入权限,例如 Calendars.ReadWrite,并确认共享日历已向该用户开放。仅请求 User.Read 无法授权创建日历事件。更改权限后,需要重新获取包含新权限的访问令牌。具体授权配置取决于应用注册方式和租户策略。

示例使用 DeviceCodeCredential,适用于需要用户通过设备代码登录的场景。如果这是面向用户的 ASP.NET Web 应用,应根据应用的登录流程选择合适的身份验证方式,并确保 Graph 客户端取得的令牌具有目标日历的写入权限。

修正方法返回类型

创建事件返回的是事件对象,不是日历集合页面。方法签名应与调用结果匹配,例如:

private async Task<Event> AddAsync()
{
    // 构造 requestBody,并创建 GraphServiceClient
    var createdEvent = await graphClient.Me
        .Calendars[calendarId]
        .Events
        .Request()
        .AddAsync(requestBody);

    return createdEvent;
}

.Request().AddAsync(...) 只适用于提供这种调用方式的 SDK 版本。使用支持 PostAsync 的版本时,应换成该版本对应的调用方式,并相应调整类型。原示例直接 return 调用结果,但方法声明为 Task<IUserCalendarsCollectionPage>,与创建事件的返回类型不匹配;异步调用也应使用 await。

备注:内容仅供参考。