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

使用C# ASP.NET Web API调用Graph API创建Teams会议时遇404错误

问题描述

我正在开发一款ASP.NET Web API,用于创建Teams会议并获取会议链接。已按照微软官方文档操作,但文档内容不完善,导致我遇到诸多错误。我已在Azure中完成应用注册,并配置了OnlineMeetings.ReadWrite.All API权限,希望无需使用通用账号即可批量创建会议,仅需授权资源创建会议即可。

代码示例

var tenantId = "...";
var clientId = "...";
var clientSecret = "...";

var options = new TokenCredentialOptions
{
    AuthorityHost = AzureAuthorityHosts.AzurePublicCloud,
};

var clientSecretCredential = new ClientSecretCredential(tenantId, clientId, clientSecret, options);

var graphClient = new GraphServiceClient(clientSecretCredential);

var requestBody = new Microsoft.Graph.Users.Item.OnlineMeetings.CreateOrGet.CreateOrGetPostRequestBody
{
    StartDateTime = DateTimeOffset.Parse("2024-02-20T14:30:00.2444915-07:00"),
    EndDateTime = DateTimeOffset.Parse("2024-02-20T15:00:00.2464912-07:00"),
    Subject = "Test meeting from graph API",
    Participants = new MeetingParticipants
    {
        Organizer = new MeetingParticipantInfo
        {
            Identity = new IdentitySet
            {
                User = new Identity
                {
                    Id = "test@example.com"
                }
            },
            Upn = "test@example.com"
        },
        Attendees = new List<MeetingParticipantInfo>
        {
            new MeetingParticipantInfo
            {
                Identity = new IdentitySet
                {
                    User = new Identity
                    {
                        Id = "test@example.com"
                    }
                },
                Upn = "test@example.com"
            }
        }
    }
};

var result = await graphClient.Users["test@example.com"].OnlineMeetings.CreateOrGet.PostAsync(requestBody);
return result.JoinWebUrl;

错误信息

执行代码时出现以下错误:

Microsoft.Graph.Models.ODataErrors.ODataError

伴随HTTP 404状态码,异常调用栈如下:

Library.Http.HttpClientRequestAdapter.ThrowIfFailedResponse(System.Net.Http.HttpResponseMessage, System.Collections.Generic.Dictionary<string, Library.Abstractions.Serialization.ParsableFactory<Library.Abstractions.Serialization.IParsable>>, System.Diagnostics.Activity, System.Threading.CancellationToken)
Library.Http.HttpClientRequestAdapter.SendAsync(Library.Abstractions.RequestInformation, Library.Abstractions.Serialization.ParsableFactory, System.Collections.Generic.Dictionary<string, Library.Abstractions.Serialization.ParsableFactory<Library.Abstractions.Serialization.IParsable>>, System.Threading.CancellationToken)
Library.Http.HttpClientRequestAdapter.SendAsync(Library.Abstractions.RequestInformation, Library.Abstractions.Serialization.ParsableFactory, System.Collections.Generic.Dictionary<string, Library.Abstractions.Serialization.ParsableFactory<Library.Abstractions.Serialization.IParsable>>, System.Threading.CancellationToken)
Users.Item.OnlineMeetings.CreateOrGet.CreateOrGetRequestBuilder.PostAsync(Users.Item.OnlineMeetings.CreateOrGet.CreateOrGetPostRequestBody, System.Action<Library.Abstractions.RequestConfiguration<Library.Abstractions.DefaultQueryParameters>>, System.Threading.CancellationToken) in CreateOrGetRequestBuilder.cs
App.Services.MeetingGeneratorService.CreateMeeting(App.Dto.v2.MeetingDto) in MeetingGeneratorService.cs


解决方案

1. 修正接口调用逻辑

CreateOrGet接口的作用是匹配已有会议或基于外部ID创建会议,必须传入ExternalId参数才能正常工作,否则会返回404。如果是创建全新会议,应该直接使用OnlineMeetings的PostAsync方法。

2. 修改代码实现

替换原有的创建会议代码,使用正确的端点:

// 构建OnlineMeeting实体(无需使用CreateOrGetPostRequestBody)
var onlineMeeting = new OnlineMeeting
{
    StartDateTime = DateTimeOffset.Parse("2024-02-20T14:30:00.2444915-07:00"),
    EndDateTime = DateTimeOffset.Parse("2024-02-20T15:00:00.2464912-07:00"),
    Subject = "Test meeting from graph API",
    Participants = new MeetingParticipants
    {
        Organizer = new MeetingParticipantInfo
        {
            Identity = new IdentitySet
            {
                User = new Identity
                {
                    Id = "用户ObjectID" // 替换为租户内有效用户的Object ID,而非UPN
                }
            },
            Upn = "test@example.com"
        }
    }
};

// 调用正确的创建接口
var result = await graphClient.Users["用户ObjectID"].OnlineMeetings.PostAsync(onlineMeeting);
return result.JoinWebUrl;

3. 关键注意事项

  • 权限确认:OnlineMeetings.ReadWrite.All应用权限需要全局管理员完成同意授权,确保权限已生效。
  • 用户ID正确性:graphClient.Users["xxx"]中的xxx必须是Azure AD用户的Object ID,可在Azure门户的用户详情页获取,部分场景下UPN也能生效,但Object ID更稳定。
  • 批量创建限制:Teams会议必须指定租户内有效用户作为组织者,无法无组织者创建;使用应用权限批量创建时,需为每个会议指定合法的组织者用户ID。

内容的提问来源于stack exchange,提问作者Jeremwhy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 10:27:38