You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 18:33:05