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

